如何从两张关联表中筛选未关联dental产品的PL表记录
你之前用外连接加PLproducts.productIdentifier <> 'dental'的条件之所以不符合需求,是因为该条件只会过滤单条关联的dental记录,不会把整个存在dental产品的plid全部排除,自然会返回该plid下其他非dental的关联行。
实现方案
方法1:使用NOT EXISTS(推荐,语义清晰、查询性能优)
逻辑和需求完全匹配,直接筛选没有关联任何dental产品的PL记录:
SELECT p.plid, p.plname FROM PL p WHERE NOT EXISTS ( SELECT 1 FROM PLproducts pp WHERE pp.plid = p.plid AND pp.productIdentifier = 'dental' );
方法2:使用LEFT JOIN + 空值判断
将productIdentifier = 'dental'的条件放在JOIN的ON子句中,关联后筛选未匹配到dental产品的PL记录:
SELECT DISTINCT p.plid, p.plname FROM PL p LEFT JOIN PLproducts pp ON p.plid = pp.plid AND pp.productIdentifier = 'dental' WHERE pp.plid IS NULL;
注意:不能把productIdentifier = 'dental'的条件放到WHERE子句中,否则会过滤掉左表的非匹配行,达不到筛选效果。
方法3:使用分组聚合判断
关联两张表后按plid分组,通过聚合条件判断分组内所有产品都不含dental:
SELECT p.plid, p.plname FROM PL p JOIN PLproducts pp ON p.plid = pp.plid GROUP BY p.plid, p.plname HAVING SUM(CASE WHEN pp.productIdentifier = 'dental' THEN 1 ELSE 0 END) = 0;
如果使用支持布尔聚合的数据库(如PostgreSQL),可简化HAVING条件为HAVING BOOL_AND(pp.productIdentifier <> 'dental')。
内容的提问来源于stack exchange,提问作者Danielle
相关产品推荐
相关产品推荐

