2014-04-11 143 views
0

這裏是我的示例腳本:SQL Server 2008中EXCEPT語句

SELECT c2, c3, c4 FROM Table1 
EXCEPT 
SELECT c2, c3, c4 FROM Table2 

我成功地從左表不也存在於右表返回唯一的記錄。兩個表都有相同的模式,大部分是相同的數據。問題是唯一的ID(我們稱之爲列c1)不匹配,所以我需要在上面的EXCEPT查詢中排除它。我如何返回相同的記錄集,但包含了唯一的ID?

我正在考慮在遊標中使用臨時表,遊標和長WHERE語句,但這似乎不是一個非常優雅的解決方案。有沒有另一種方式來完成這個看似簡單的任務?

+0

表中存在記錄? –

回答

1

試試這個

SELECT A.c1, A.c2, A.c3, A.c4 
FROM Table1 A 
LEFT OUTER JOIN Table2 B ON A.c2 = B.C2 AND A.c3 = B.C3 AND A.c4 = B.C4 
WHERE B.c1 IS NULL; 
+0

謝謝,我會試試這個。 –

+0

那個工作很漂亮!謝謝! –

1

你可能使用「NOT EXISTS」,而不是「除」,因爲有「NOT EXISTS」你可以指定條件能夠完成它。這裏有一個線索指出:EXCEPT vs NOT EXISTS

2

你可以把你提供的查詢,並簡單地inner join它與表1來得到你的'C1'專欄?

SELECT T1.* FROM Table1 T1 INNER JOIN(
    SELECT c2, c3, c4 FROM Table1 
    EXCEPT 
    SELECT c2, c3, c4 FROM Table2 
) a on a.c2=T1.c2 and a.c3=T1.c3 and a.c4=T1.c4 
+1

+1,因爲你打我(但你想檢查你的表別名...) –

+0

馬特 - 爲什麼掃描表兩次,當使用左外連接和掃描表只能一次實現相同的結果。 –

+0

@rs。 - 我想使用OP的原始查詢,因爲我知道它已經產生了他想要的所有結果,減去c1。 –

0

這是一種醜陋,在缺乏「有用」索引大表,可能會執行得非常糟糕,但它會做的工作:

SELECT t1.c1, t1.c2, t1.c3, t1.c4 
from Table1 t1 
    inner join (-- Unique tuples 
       SELECT c2, c3, c4 FROM Table1 
       EXCEPT 
       SELECT c2, c3, c4 FROM Table2 
      ) xx 
    on xx.c2 = t1.c2 
    and xx.c3 = t1.c3 
    and xx.c5 = t1.c4 
你要哪唯一的ID,如果拔出
相關問題