简体   繁体   English

SQL Server中表之间的参照完整性

[英]Referential integrity between tables in SQL Server

在此处输入图片说明

I have 2 tables, Members and Enrollments . 我有2个表格, MembersEnrollments 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM