我有兩個包含文章的表。比較兩個表並獲取不匹配的值
表1 article
和表2 articlefm
兩個表具有一個場與artnr
。
'表1'具有2192,artnr
和'表2'具有2195,artnr
。
我想在我的查詢中找出什麼是3個不匹配的文章中的artnr
。
如果'表2'有更多的文章,然後'表1',那麼我需要一個與這些artnr
列表。
我該如何做到這一點?
我有兩個包含文章的表。比較兩個表並獲取不匹配的值
表1 article
和表2 articlefm
兩個表具有一個場與artnr
。
'表1'具有2192,artnr
和'表2'具有2195,artnr
。
我想在我的查詢中找出什麼是3個不匹配的文章中的artnr
。
如果'表2'有更多的文章,然後'表1',那麼我需要一個與這些artnr
列表。
我該如何做到這一點?
在大多數數據庫,你可以使用except
(SQL標準)或minus
(Oracle專用):
select artnr
from articlefm -- table 2
except
select artnr
from article -- table 1
其他你可以嘗試not in
:
select atrnr
from articlefm -- table 2
where atrnr not in
(select artnr
from article -- table 1
)
這會給你的文章編號,存在於2中,但不在1中。
您可以使用FULL JOIN
來執行此操作:
SELECT COALESCE(t1.Artnr, t2.Artnr) AS Artnr,
CASE WHEN t1.Artnr IS NULL THEN 'Table1' ELSE 'Table2' END AS MissingFrom
FROM Table1 AS t1
FULL JOIN Table2 AS t2
ON t1.Artnr = t2.Artnr
WHERE t1.Artnr IS NULL
OR t2.Artnr IS NULL;
請注意,只是因爲3的計數存在差異,並不一定表示一個表中只有3個記錄從另一個表中缺失。想象一下以下內容:
Table1 Table2
------ -------
1 2
2 4
3 6
4
的差異數爲1,但實際上有2條記錄出現在表1中沒有的表2和表2中,是不是在表1 1。使用上面的全連接方法,您將得到如下結果:
Artnr | MissingFrom
------+-------------
1 | Table1
3 | Table1
6 | Table2
'except'是由SQL標準定義的運算符。 Oracle正在使用的是「minus」。 – 2014-10-16 10:47:56
@a_horse_with_no_name:感謝您的澄清。 – 2014-10-16 10:48:59