如何用SQL筛选仅含ISC记录的BATCH_ID?
解决方案:筛选仅存在ISC记录的BATCH_ID
你之前的WHERE RESULT LIKE '%ISC%'只能筛选出包含ISC的行,但无法排除那些同时存在其他RESULT(比如LLC)的BATCH_ID,以下是几种可行的SQL方案:
方法1:GROUP BY + HAVING(通用型,适配多数数据库)
通过分组统计每个BATCH_ID下的记录特征,确保仅包含ISC:
SELECT BATCH_ID FROM PM_BATCH_ST GROUP BY BATCH_ID HAVING SUM(CASE WHEN RESULT != 'ISC' THEN 1 ELSE 0 END) = 0;
原理:用CASE语句统计每个BATCH_ID下非ISC的记录数,结果为0则说明该BATCH_ID只有ISC记录。
也可以用更直观的写法:
SELECT BATCH_ID FROM PM_BATCH_ST GROUP BY BATCH_ID HAVING COUNT(DISTINCT RESULT) = 1 AND MAX(RESULT) = 'ISC';
原理:先确保该BATCH_ID只有一种RESULT,再确认这个RESULT是ISC。
方法2:NOT EXISTS子查询
通过子查询排除存在非ISC记录的BATCH_ID:
SELECT DISTINCT BATCH_ID FROM PM_BATCH_ST t1 WHERE RESULT = 'ISC' AND NOT EXISTS ( SELECT 1 FROM PM_BATCH_ST t2 WHERE t2.BATCH_ID = t1.BATCH_ID AND t2.RESULT != 'ISC' );
原理:先定位有ISC的BATCH_ID,再排除掉那些存在其他RESULT的ID。
方法3:EXCEPT/MINUS(按需选择,依数据库类型)
如果你的数据库支持集合差操作,可以用这种简洁写法:
- PostgreSQL/SQL Server用EXCEPT:
SELECT BATCH_ID FROM PM_BATCH_ST WHERE RESULT = 'ISC' EXCEPT SELECT BATCH_ID FROM PM_BATCH_ST WHERE RESULT != 'ISC';
- Oracle用MINUS:
SELECT BATCH_ID FROM PM_BATCH_ST WHERE RESULT = 'ISC' MINUS SELECT BATCH_ID FROM PM_BATCH_ST WHERE RESULT != 'ISC';
原理:取所有包含ISC的BATCH_ID,减去存在非ISC的BATCH_ID,剩余的就是仅存ISC的ID。
内容的提问来源于stack exchange,提问作者user22060295
相关产品推荐
相关产品推荐

