我有两个相同的表:
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) ;
但这不起作用。它比较整个表,我不在乎qty
或者unit
是不同的,我只在乎id1,id2
。
使用完整的外部联接:
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 )
这将显示a中不匹配b的行。
或使用联接的相同结果
select a.* from a left outer join b on a.id1=b.id1 and a.id2=b.id2 where b.id1 is null
有时联接比“不在”更快