You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多表左连接时如何按指定值组合排除对应客户的所有行

问题原因

你之前的写法属于行级过滤,仅过滤掉了匹配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:36:03