SQL:根据表B中的列值查找表A中没有表B中值的所有记录

时间:2017-06-08 00:43:23

标签: sql sql-server sql-server-2012 left-join

使用Microsoft SQL Server 2012,我试图让所有未在2016年付款的商家获得。

这是我的架构

:

我需要一个返回Business A的SQL语句,因为它没有2016年的付款。

以下是我的尝试:

Business Table
---------------
Id     Name
1      Business A
2      Business B

Payments Table
---------------
Id     BusinessId   Year
1      2            2016
2      1            2017
3      2            2017

非常感谢任何帮助。

此外,标题可能有点令人费解,因此欢迎对此问题的标题进行建议编辑。

2 个答案:

答案 0 :(得分:2)

NOT EXISTS,因为没有2016年的交易而应该返回商业A

about:home

答案 1 :(得分:2)

我认为您正在寻找不在付款表中的业务和年份的组合。如果是这样的话:

select b.*
from businesses b cross join
     (select distinct year from payments) y left join
     payments p
     on b.id = p.businessid and b.year = y.year
where p.businessid is null;

cross join生成所有业务和年份的组合。 left joinwhere子句会找到不存在的子句。

如果您只寻找一年,那么@maSTAShuFu答案是正确的方法。