2014-12-02 51 views
0

我有兩個具有相似結構的oracle表, 主要區別在於一個是另一個的子集。 我想要做的是執行一個連接,它將返回不在子集表中的所有行。使用Oracle,如何查看不匹配的結果?

問題是唯一標識符是大約6-7列。 所以我不能只做一個WHERE NOT IN條款。 有誰知道哪種類型的加入或我如何做到這一點?

回答

0

您可以編寫一個MINUS查詢。請確保提及確切的column名稱,即MINUS查詢中兩個SQL中具有相同data type的確切列數。

因此返回的結果集是兩個表之間的行的差異。

0

where not in就是答案。

查詢將是這樣的:

select blam, hoot, kapow 
from schmarr 
where blam not in 
(select blam from smashy) 

blam必須具有以下特性:

  1. 標識在schmarr和smashy表都行。
  2. 既不是你提到的調皮專欄6也不是調皮專欄7。

該schmarr表是超集表。粉碎表是子集表。

0

我們假設表B是表A的子集。

select * from Table-A left outer join Table-b on 
     Table-A.column1 = Table-b.column2 and 
     Table-A.column2 = Table-b.column2 and .... 

其中columns1,列2,...是唯一標識符

2

假設你的主鍵是(COL1,COL2,...)

最簡單的答案是使用MINUS set operator

SELECT COL1,COL2 FROM T 
MINUS SELECT COL1,COL2 FROM U; 

如果您覺得需要,或者有更復雜的邏輯,您可能更喜歡使用outer join

SELECT COL1,COL2 
FROM T LEFT JOIN U 
USING(COL1,COL2) 
WHERE U.ROWID IS NULL; 

請注意WHERE子句過濾出來的結果設置爲只保留行存在於U表的PK。

此外,所有的比較僅在主鍵上執行,而不是檢查其他列。請參閱http://sqlfiddle.com/#!4/6e42f/13。根據執行計劃,你會看到在我的非常簡單的例子中,OUTER JOIN表現更好。


話雖這麼說,在子查詢語法可能表現得更好,因爲Oracle的優化構建幾乎比外相同的執行計劃加入。 ,關鍵的區別是使用抗嵌套循環的,不再需要的額外NOT NULL過濾器:

SELECT COL1,COL2 FROM T 
WHERE (COL1,COL2) NOT IN (SELECT COL1,COL2 FROM U); 

據我所知,NOT IN操作是執行的唯一途徑anti join你需要。

相關問題