多表左连接时如何按指定值组合排除对应客户的所有行
问题原因
你之前的写法属于行级过滤,仅过滤掉了匹配OrderID=10308 AND OrderDetailID=162的单条记录,没有对客户整体做排除,所以符合排除条件的客户的其他关联记录还是会出现在结果中。
解决方案
方案1:使用NOT IN子查询(逻辑直观,适合小数据量场景)
先通过子查询查出所有需要排除的客户ID,再在主查询中整体过滤这些客户:
SELECT c.CustomerID, o.OrderID, od.OrderDetailID FROM Customers c LEFT JOIN ORDERS o ON c.CustomerID = o.CustomerID LEFT JOIN ORDERDetails od ON od.OrderID = o.OrderID WHERE c.CustomerID NOT IN ( SELECT DISTINCT o.CustomerID FROM ORDERS o INNER JOIN ORDERDetails od ON od.OrderID = o.OrderID WHERE o.OrderID = 10308 AND od.OrderDetailID = 162 )
执行结果符合预期:
CustomerID OrderID OrderDetailID 1 null null 3 10365 314
方案2:使用NOT EXISTS(性能更优,适合大数据量场景)
通过关联子查询判断当前客户是否存在需要排除的组合,只要存在就整体过滤:
SELECT c.CustomerID, o.OrderID, od.OrderDetailID FROM Customers c LEFT JOIN ORDERS o ON c.CustomerID = o.CustomerID LEFT JOIN ORDERDetails od ON od.OrderID = o.OrderID WHERE NOT EXISTS ( SELECT 1 FROM ORDERS o_exclude INNER JOIN ORDERDetails od_exclude ON od_exclude.OrderID = o_exclude.OrderID WHERE o_exclude.CustomerID = c.CustomerID AND o_exclude.OrderID = 10308 AND od_exclude.OrderDetailID = 162 )
内容的提问来源于stack exchange,提问作者was_777
相关产品推荐
相关产品推荐

