如何查询PACKLIST表中含COLLID 'COL001'且不含'COL200'的PLANNAME
问题原因
你之前写的WHERE COLLID = 'COL001' AND COLLID != 'COL200'只能过滤单条行的COLLID值,无法判断同一个PLANNAME下的所有关联COLLID情况:这条语句只会把所有值为COL001的行筛出来,但只要某个PLANNAME同时有COL001和COL200两条记录,还是会出现在结果里,不符合你的需求。
推荐写法
方法1:使用EXISTS + NOT EXISTS(兼容性最好,逻辑清晰,查询效率高)
SELECT DISTINCT PLANNAME FROM PACKLIST p1 WHERE EXISTS ( SELECT 1 FROM PACKLIST p2 WHERE p2.PLANNAME = p1.PLANNAME AND p2.COLLID = 'COL001' ) AND NOT EXISTS ( SELECT 1 FROM PACKLIST p3 WHERE p3.PLANNAME = p1.PLANNAME AND p3.COLLID = 'COL200' );
方法2:使用分组聚合判断(适合需要同时统计其他关联指标的场景)
SELECT PLANNAME FROM PACKLIST GROUP BY PLANNAME HAVING SUM(CASE WHEN COLLID = 'COL001' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN COLLID = 'COL200' THEN 1 ELSE 0 END) = 0;
如果你的数据库支持BOOL_OR这类聚合函数,写法可以更简化:
SELECT PLANNAME FROM PACKLIST GROUP BY PLANNAME HAVING BOOL_OR(COLLID = 'COL001') = TRUE AND BOOL_OR(COLLID = 'COL200') = FALSE;
效果说明
两种写法都可以保证返回的PLANNAME同时满足:
- 至少有一条关联记录的
COLLID为COL001 - 没有任何关联记录的
COLLID为COL200
内容的提问来源于stack exchange,提问作者Krimmero
相关产品推荐
相关产品推荐

