我总结了三种方法:
一、数据比较少的时候用 not in 或者not exists
IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
(一). 在子查询中使用 NULL 仍然返回结果集
select * from TableIn where exists(select null)
(二). 比较使用 EXISTS 和 IN 的查询。注意两个查询返回相同的结果。
select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME in(select BNAME from TableEx)
(三). 比较使用 EXISTS 和 = ANY 的查询。注意两个查询返回相同的结果。
select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME=ANY(select BNAME from TableEx)
二、用EXCEPT实现
SELECT COUNT(DISTINCT num )FROM (
(SELECT FullNumber num FROM BCBJ.LinkPhone
EXCEPT
(SELECT number num FROM STAT.InvalidNumbers
EXCEPT
从 EXCEPT 操作数左边的查询中返回右边的查询未返回的所有非重复值。
INTERSECT
返回 INTERSECT 操作数左右两边的两个查询均返回的所有非重复值。
三、用左连接,加上个字段,然后删选出字段为空的数据。大宝帮想的,速度也很快。
SELECT DISTINCT
FROM
WHERE