SQL如何查询无匹配关联行的记录?编写的查询返回空是什么原因
问题原因分析
你编写的SQL使用了INNER JOIN,该关联逻辑仅会返回两张表在关联字段t1.ID = t2.salesperson_id上完全匹配的记录。所有能进入结果集的行,t2.salesperson_id必然存在有效值,不可能为NULL,因此后续的WHERE筛选条件永远无法满足,自然不会返回任何结果。
正确实现方案
要找出没有匹配订单的销售记录,可以使用以下三种常见实现方式:
- 方案1:LEFT JOIN(最常用,兼容性最好)
LEFT JOIN会保留左表(Salesperson)的全部记录,右表Orders没有匹配项时,对应的所有字段会自动填充为NULL,此时筛选右表关联字段为NULL的行即可:
SELECT * FROM Salesperson t1 LEFT JOIN Orders t2 ON t1.ID = t2.salesperson_id WHERE t2.salesperson_id IS NULL
- 方案2:NOT EXISTS
逻辑更直观,直接筛选不存在对应订单的销售记录:
SELECT * FROM Salesperson t1 WHERE NOT EXISTS ( SELECT 1 FROM Orders t2 WHERE t2.salesperson_id = t1.ID )
- 方案3:NOT IN
使用时需要注意排除子查询中salesperson_id为NULL的情况,否则会导致整个查询无结果:
SELECT * FROM Salesperson WHERE ID NOT IN ( SELECT salesperson_id FROM Orders WHERE salesperson_id IS NOT NULL )
内容的提问来源于stack exchange,提问作者julz oh
相关产品推荐
相关产品推荐

