检查SQL Server中的多个表中是否存在值

时间:2017-04-05 15:07:24

标签: sql sql-server

我有一个姓氏列表和他们唯一的ID。在我们的数据库中,我们有两个与姓氏相关的表。第一个表具有当前的姓氏,第二个表具有别名/过去的姓氏。如何仅返回两个表中不存在姓氏的个人的姓氏和ID?

我尝试过使用NOT IN:

SELECT 
    A.[ID], A.[Last Name]
FROM 
    Involvement_Data A
INNER JOIN 
    DIM_CONSTITUENT B ON A.[ID] = B.[LOOKUPID]
LEFT JOIN 
    DIM_CONSTITUENTALIAS C ON B.[CONSTITUENTSYSTEMID] = C.[CONSTITUENTSYSTEMID]
WHERE 
    A.[Last Name] NOT IN (B.[LASTNAME], C.[LASTNAME]);

但这些表似乎是单独评估的,导致我重新获得值,因为它在DIM_CONSTITUENT OR DIM_CONSTITUENTALIAS中不存在。它不会整体评估表格。我也尝试将NOT EXISTS与相关子查询一起使用,但似乎仍然得到我不想要的结果。

1 个答案:

答案 0 :(得分:6)

如果我理解正确,那你几乎就是

SELECT  A.[ID],
        A.[Last Name]
FROM    Involvement_Data A
LEFT JOIN
        DIM_CONSTITUENT B
ON      A.[ID] = B.[LOOKUPID]
LEFT JOIN
        DIM_CONSTITUENTALIAS C
ON      A.[ID] = C.[CONSTITUENTSYSTEMID]
WHERE   B.[LASTNAME] is null or C.[LASTNAME] is null;

修改

正如@Cameron正确指出的那样,这个答案缺乏任何解释,所以就是这样。

您需要做的是保留第一个表中的所有行,并在可能的情况下将它们与其他两个行的行匹配。结果集将类似于

tableA   | tableB   | tableC
somerow1 | somerow1 | somerow1
somerow2 | NULL     | somerow2
somerow3 | somerow3 | NULL
somerow4 | NULL     | NULL

您要保留的行是其名称不在tableB和tableC中的行,因此您只能过滤其中一个为null