SQL Query返回另一个表中没有匹配项的行

时间:2015-11-09 20:03:29

标签: sql sql-server

我有一个用户国家/地区表,其中我列出了一个用户国家/地区列表 - 用户可以拥有多个地址,因此有很多国家

它通过地址表

连接到用户表

如果我从UserCountry返回的选择不同的CountryId返回的是:

1
2
3
4
5
6
etc

如果我运行以下查询,我会收到一个用户返回

select * from User u join Address a
on u.AddressId = a.Id
where a.CountryId = 1

如果我再运行

select * from User u join Address a
on u.AddressId = a.Id
where a.CountryId = 2

我没有返回任何数据,这很好。我需要做的是传入一个包含所有不同Country Ids的列表,并生成一个输出,其中set返回一个User Object,哪个set不返回User对象

2 个答案:

答案 0 :(得分:1)

以下查询:

SELECT CountryId, COALESCE(t2.cnt, 0) AS usersPerCountry 
FROM (
   SELECT DISTINCT CountryId 
   FROM UserCountry) AS t1
LEFT JOIN (
   SELECT a.CountryId, COUNT(*) AS cnt
   FROM User u 
   INNER JOIN Address a ON u.AddressId = a.Id
   GROUP BY a.CountryId
) AS t2 ON t1.CountryId = t2.CountryId
ORDER BY COALESCE(t2.cnt, 0) DESC

将为您提供与每个国家/地区相关联的用户数量。如果某个国家/地区与任何用户完全无关,则会返回0

<强>解释

上述查询使用了两个派生表t1t2

  • 查询的第一个派生表t1包含CountryId中包含的所有不同UserCountry值的列表。
  • 第二个派生表t2返回每CountryId个用户数。此子查询不返回没有用户的ID。

LEFT JOINt1之间以t2作为第一个表格执行t1会返回 t1的所有值,即 CountryId中包含的所有 UserCountry值。如果t2中没有匹配项,则t2.cntNULLCOALESCE子句中使用的SELECT会将此NULL值转换为0

答案 1 :(得分:0)

这将为您提供没有国家/地区条目的用户和地址中的所有项目。这是你在找什么?

SELECT *
FROM User U
JOIN Address a
ON a.Id = u.AddressId
WHERE NOT EXISTS
(
   SELECT 1
   FROM UserCountry uc
   WHERE uc.CountryId = a.CountryId
);

对于没有用户的Country项列表,您可以替换这些语句,并找到CountryId和{{1}中NOT EXISTS User的位置表格