2017-04-05 217 views
2

我有一個姓氏及其唯一ID的列表。在我們的數據庫中,我們有兩個與姓氏相關的表格。第一個表具有當前的姓氏,第二個表具有別名/過去的姓氏。如何僅返回兩個表中不存在姓氏的個人的姓氏和身份證號碼?檢查一個值是否存在於多個表中SQL Server

我使用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與相關的子查詢,但似乎仍然得到我沒有找到的結果。

回答

6

如果我理解正確,your're幾乎沒有

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的和表C,所以你可以篩選被空

+0

幾乎一碼兩個中的一個只回答。你可能想解釋用'LEFT JOIN'替換'INNER JOIN',並使用'IS NULL'。 – Cameron

+0

@Cameron你說得對,我加了一些解釋 –

相關問題