多列条件筛选问题:获取BookParameter1为FN且4不为YES的BookNo
图书信息表SQL查询问题
表结构与数据
现有一张存储图书信息的表,字段包括BookNo、BookParameter、Value,数据如下:
BookNo BookParameter Value 1234 1 FN 1234 2 False 1234 3 30 1234 4 YES 2222 1 FN 2222 2 True 2222 3 25 2222 4 NO 3333 1 THR 3333 2 True 3333 3 54 3333 4 YES 4444 1 FN 4444 2 TRUE 4444 3 12 4444 4 NO
需求说明
需要获取所有满足BookParameter=1且Value='FN'的BookNo,但要排除那些对应同一BookNo存在BookParameter=4且Value='YES'记录的编号,最终期望输出:
BookNo 2222 4444
错误尝试分析
你之前的两个查询之所以无效,是因为SQL条件是逐行判断的:当筛选BookParameter=1的行时,同一行不可能同时是BookParameter=4,所以后面的排除条件相当于没有生效,自然会返回所有符合BookParameter=1且Value='FN'的记录。
正确SQL实现
这里提供两种可行的写法:
方法一:子查询排除法
先找出所有符合初始条件的BookNo,再排除掉存在BookParameter=4且Value='YES'的编号:
SELECT DISTINCT BookNo FROM 你的表名 WHERE BookParameter = 1 AND Value = 'FN' AND BookNo NOT IN ( SELECT BookNo FROM 你的表名 WHERE BookParameter = 4 AND Value = 'YES' )
方法二:分组聚合判断法
按BookNo分组,通过聚合函数判断该编号是否满足“有符合条件的1+FN记录,且没有4+YES记录”:
SELECT BookNo FROM 你的表名 GROUP BY BookNo HAVING SUM(CASE WHEN BookParameter=1 AND Value='FN' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN BookParameter=4 AND Value='YES' THEN 1 ELSE 0 END) = 0
两种方法都能得到你需要的结果,可根据实际数据库性能选择合适的写法。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

