[英]Referential integrity between tables in SQL Server
I have 2 tables, Members
and Enrollments
. 我有2个表格,
Members
和Enrollments
。 Both tables can be joined using primary key Member ID
. 可以使用主键
Member ID
来连接两个表。
I need to write a query which returns all the members in the Members
table which don't have a corresponding row in the Enrollments
table and vice versa. 我需要编写一个查询,该查询返回
Members
表中的所有成员,而Enrollments
表中没有相应的行,反之亦然。
This is what I have so far: 这是我到目前为止的内容:
IF OBJECT_ID('tempdb..#memberswithoutenrollments') IS NOT NULL
DROP TABLE #memberswithoutenrollments
SELECT m.*
INTO #memberswithoutenrollments
FROM ABC_Members m
LEFT OUTER JOIN ABC_MemEnrollment e ON m.MemberID = MemberID
FULL JOIN
is a simple method for comparing lists between two tables: FULL JOIN
是比较两个表之间的列表的一种简单方法:
SELECT COALESCE(e.MemberID, m.MemberID),
(CASE WHEN e.MemberID IS NULL THEN 'No Enrollments' ELSE 'No Member' END)
FROM ABC_Members m FULL JOIN
ABC_MemEnrollment e
ON m.MemberID = e.MemberID
WHERE e.MemberID IS NULL OR m.MemberID IS NULL;
But if you have proper foreign key relationships, then you should never have enrollments without members. 但是,如果您具有适当的外键关系,那么在没有成员的情况下永远不要注册。
You can use NOT IN
to your benefit here. 您可以
NOT IN
这里使用NOT IN
以使您受益。
WITH
-- Create a list of all of the matches
in_table AS
(
SELECT
Member_ID
FROM
Enrollments
WHERE
Members.MemberID = Enrollments.Member_ID
),
result_table AS
(
SELECT
*
FROM
Members
-- Grab only the values from members that DO NOT APPEAR in in_table
WHERE
MemberID NOT IN (SELECT DISTINCT FROM in_table)
)
-- Grab all results
SELECT * FROM result_table
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.