SQL:选择表A中不在表B中的值(反之亦然)

时间:2015-11-25 04:40:20

标签: sql sql-server

根据两个不同年份收集的地区(地区),我有一个假设的人口普查信息:

第1年表

District | Name
----------------
1        | Paul
1        | John
2        | Max
2        | Aaron
3        | Michael

第2年表

District | Name
1        | Paul
1        | John
1        | Michael
3        | Michael

我想要两个问题:

查询1:按地区列出新人。应该返回1区的迈克尔

查询2:按地区列出错过的人数。应该返回2区的Max和Aaron

2 个答案:

答案 0 :(得分:0)

我会使用union all和聚合来完成此操作。以下查询返回仅在一年内出现的名称/区域组合以及特定年份:

select district, name, min(yyyy)
from ((select 1 as yyyy, district, name from table1) union all
      (select 2, district, name from table2)
     ) tt
group by district, name
having count(distinct yyyy) = 1;

答案 1 :(得分:0)

查询1:按地区列出新人。应该返回第1区的迈克尔

SELECT        Name, District
FROM            year2
WHERE        (Name NOT IN
                             (SELECT        Name
                               FROM            year1
                               WHERE        (District = year2.District)))
GROUP BY Name, District

查询2:按地区列出错过的人数。应该返回第2区的Max和Aaron

SELECT        Name, District
FROM            year1
WHERE        (Name NOT IN
                             (SELECT        Name
                               FROM            year2
                               WHERE        (District = District)))
GROUP BY Name, District

如果您需要进一步合并结果,请使用union all