我有兩個具有相似結構的oracle表, 主要區別在於一個是另一個的子集。 我想要做的是執行一個連接,它將返回不在子集表中的所有行。使用Oracle,如何查看不匹配的結果?
問題是唯一標識符是大約6-7列。 所以我不能只做一個WHERE NOT IN
條款。 有誰知道哪種類型的加入或我如何做到這一點?
我有兩個具有相似結構的oracle表, 主要區別在於一個是另一個的子集。 我想要做的是執行一個連接,它將返回不在子集表中的所有行。使用Oracle,如何查看不匹配的結果?
問題是唯一標識符是大約6-7列。 所以我不能只做一個WHERE NOT IN
條款。 有誰知道哪種類型的加入或我如何做到這一點?
您可以編寫一個MINUS
查詢。請確保提及確切的column
名稱,即MINUS查詢中兩個SQL中具有相同data type
的確切列數。
因此返回的結果集是兩個表之間的行的差異。
where not in
就是答案。
查詢將是這樣的:
select blam, hoot, kapow
from schmarr
where blam not in
(select blam from smashy)
列blam
必須具有以下特性:
該schmarr表是超集表。粉碎表是子集表。
我們假設表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,...是唯一標識符
假設你的主鍵是(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你需要。