如何使用JOIN替代SELECT NOT IN实现无关联数据的SQL查询
实现代码
你可以通过 LEFT JOIN 搭配空值判断实现需求,无需嵌套子查询:
SELECT c.customer_name FROM customers c LEFT JOIN documents d ON c.customer_id = d.customer_id AND d.document_name = 'Rent contract' WHERE d.document_id IS NULL;
逻辑说明
- 先以客户表为基表,左关联文档表,关联条件同时限定文档类型为「租房合同」,这一步会保留所有客户记录,有对应租房合同的客户会带出文档数据,没有对应合同的客户关联到的文档字段全部为NULL
- 最后通过筛选文档主键
document_id为NULL的记录,就能得到所有没有租房合同的客户
注意事项
d.document_name = 'Rent contract'必须写在LEFT JOIN的ON子句中,如果写在WHERE子句里,会先过滤掉所有非租房合同的文档记录再关联,逻辑等价于内连接,无法得到正确结果- 该写法相比原
NOT IN方案,规避了子查询返回结果存在NULL时NOT IN返回空集的兼容性问题,稳定性更高
内容的提问来源于stack exchange,提问作者VlLight
相关产品推荐
相关产品推荐

