SQL如何筛选无CustTypeKey=7关联客户的项目与DesignGroup
原有语句错误原因
你写的SQL逻辑从根上就不对:
- 几个内连接连完之后,返回的是每个设计组下所有关联客户的配对行,加
WHERE c.CustTypeKey NOT IN(7),只会把当前行恰好是7类客户的记录踢掉 - 要是一个设计组同时挂了7类客户和其他类型客户,其他类型客户对应的配对行根本不会被这个条件过滤,最后查出来的结果自然会混进带7类客户的项目,完全达不到「完全没关联7类客户」的筛选要求。
正确写法
用NOT EXISTS做存在性判断最贴合需求,性能稳定,也不会踩空值导致结果异常的坑,语句如下:
SELECT p.ProjectKey, -- 按需添加Project表需要返回的其他字段 dg.DesignGroupId -- 按需添加DesignGroup表需要返回的其他字段 FROM project AS p INNER JOIN designgroup AS dg ON p.ProjectKey = dg.ProjectKey WHERE NOT EXISTS ( SELECT 1 FROM DesignGroupCustomer AS dgc INNER JOIN Customer AS c ON dgc.CustomerKey = c.CustomerKey WHERE dgc.DesignGroupId = dg.DesignGroupId AND c.CustTypeKey = 7 )
逻辑说明
- 子查询的作用是匹配当前设计组下所有关联了7类客户的记录
NOT EXISTS会把所有能匹配到子查询结果的设计组全部排除:不管这个设计组关联了多少其他类型的客户,只要存在哪怕一条7类客户的关联关系,就会被过滤掉,完全匹配需求- 不推荐用
NOT IN实现这类逻辑,一旦关联字段存在空值很容易出现结果不符合预期的问题,在关联字段建有索引的场景下,NOT EXISTS的查询效率也更优。
内容的提问来源于stack exchange,提问作者Jesus
相关产品推荐
相关产品推荐

