如何排除关联查询命中的行?SQL数据筛选问题求助
解决方案
方案一:使用NOT EXISTS子查询
这种方式逻辑直观,精准排除符合原查询条件的目标行:
SELECT pt.* FROM ab.Price_table pt WHERE NOT EXISTS ( SELECT 1 FROM bib.items i INNER JOIN bib2.spefile sf ON i.zzcod = sf.spcod AND pt.xxdat = sf.spdat AND pt.xxdev = sf.spdev AND sf.spflg = 'INFO' WHERE pt.xxetab = i.zzetab AND pt.xxitem = i.zzitem AND pt.xxpri IN (sf.spPRR1, sf.psPRR2, sf.psPRR3, sf.psPRR4, sf.psPRR5) );
原理:每一行Price_table数据都会检查是否存在于原查询的结果集中,不存在则保留,正好实现排除目标行的需求。
方案二:修正LEFT JOIN写法
如果之前左连接失败,问题通常出在条件放置位置错误,正确写法如下:
SELECT pt.* FROM ab.Price_table pt LEFT JOIN bib.items i ON pt.xxetab = i.zzetab AND pt.xxitem = i.zzitem LEFT JOIN bib2.spefile sf ON i.zzcod = sf.spcod AND pt.xxdat = sf.spdat AND pt.xxdev = sf.spdev AND sf.spflg = 'INFO' AND pt.xxpri IN (sf.spPRR1, sf.psPRR2, sf.psPRR3, sf.psPRR4, sf.psPRR5) WHERE i.zzetab IS NULL OR sf.spcod IS NULL;
原理:左连接会保留Price_table的所有行,当某行符合原查询的匹配条件时,items和spefile会有对应数据。通过WHERE子句筛选出未匹配到关联表数据的行,即排除原查询命中的目标行。
内容的提问来源于stack exchange,提问作者aicha04
相关产品推荐
相关产品推荐

