如何在Postgresql中比较两个表?

时间:2016-01-06 06:48:29

标签: sql postgresql

我有两张相同的表格:

A :   id1, id2, qty, unit
B:    id1, id2, qty, unit

(id1,id2)集合标识每一行,每个表格只能出现一次。

我在表140中有A行,在表141 rows中有B行。 我想找到两个表中没有出现的所有键(id1,id2)。有1是肯定的,但不能有更多(例如,如果每个表有完整的不同数据)。

我写了这个查询:

(TABLE a EXCEPT TABLE b)
UNION ALL
(TABLE b EXCEPT TABLE a) ;

但它不起作用。它会比较整个表格,我不在乎qtyunit是不同的,我只关心id1,id2

1 个答案:

答案 0 :(得分:3)

使用完整的外部联接:

 select a.*,b.* 
 from a full outer join b 
   on a.id1=b.id1 and a.id2=b.id2

这两个表并排显示。有空隙的地方有无可匹敌的行。

 select a.*,b.* 
 from a full outer join b 
   on a.id1=b.id1 and a.id2=b.id2
   where a.id1 is null or b.id1 is null;

只显示不匹配的行。

或者您可以不在

中使用
select * from a 
  where (id1,id2) not in
   ( select id1,id2 from b )

将显示与b不匹配的行。

或使用连接的相同结果

select a.* 
  from a left outer join b 
  on a.id1=b.id1 and a.id2=b.id2
  where b.id1 is null

有时连接比“不在”

更快