比较两个表并获取不匹配的值

时间:2014-10-16 10:43:32

标签: sql

我有两张带有文章的表格。

表1 article和表2 articlefm

两个表都有一个artnr字段。

'表1'有2192 artnr,'表2'有2195 artnr

我想在我的查询中找出3篇文章中artnr未匹配的内容。

如果'表2'有更多文章然后'表1'那么我需要一个包含artnr的列表。

我该怎么做?

2 个答案:

答案 0 :(得分: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,但是table1中实际上有2条记录在table2中不存在,而table2中的1则不在table1中。使用上面的完整连接方法,您将获得如下结果:

Artnr | MissingFrom
------+-------------
  1   |  Table1
  3   |  Table1
  6   |  Table2

答案 1 :(得分:0)

在大多数数据库中,您可以使用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中的文章编号。