SQL分组查询需求:筛选不含FLAG=0且包含FLAG=1的记录
解决分组筛选NAME的问题
首先,咱们先看看你原来的查询为什么没得到预期结果:select * from mytable where FLAG NOT IN (0) GROUP BY NAME; 这个语句只是把表中FLAG=0的行过滤掉了,但并没有排除那些本身存在FLAG=0记录的NAME。比如abc这个NAME,虽然它有FLAG=1和2的行,但它同时也有FLAG=0的行,按照需求应该被排除,但你的原查询会保留abc的1和2行并分组,这就不符合要求了。
要实现你的需求——找出没有FLAG=0但包含FLAG=1的NAME,我们可以用两种常用的方法:
方法一:GROUP BY + HAVING子句(推荐)
这种方法直接通过分组后统计每个NAME的FLAG情况,精准筛选符合条件的记录:
SELECT NAME, 1 AS FLAG FROM mytable GROUP BY NAME HAVING -- 统计该NAME下FLAG=0的记录数,等于0表示没有0 COUNT(CASE WHEN FLAG = 0 THEN 1 END) = 0 -- 统计该NAME下FLAG=1的记录数,大于0表示至少有一条1 AND COUNT(CASE WHEN FLAG = 1 THEN 1 END) > 0;
这里我们直接把FLAG设为1,因为已经确认该NAME存在FLAG=1的记录,这样就能得到你想要的结果格式。
如果你想更直观地看到统计逻辑,也可以用SUM代替COUNT:
SELECT NAME, 1 AS FLAG FROM mytable GROUP BY NAME HAVING SUM(CASE WHEN FLAG = 0 THEN 1 ELSE 0 END) = 0 AND SUM(CASE WHEN FLAG = 1 THEN 1 ELSE 0 END) > 0;
方法二:子查询排除法
先找出所有存在FLAG=0的NAME,然后排除这些NAME,再筛选出FLAG=1的记录并去重:
SELECT DISTINCT NAME, 1 AS FLAG FROM mytable WHERE NAME NOT IN (SELECT NAME FROM mytable WHERE FLAG = 0) AND FLAG = 1;
DISTINCT用来避免同一个NAME因为有多个FLAG=1的行而重复显示。
这两种方法都能得到你期望的结果:
NAME FLAG ------------------ def 1 efg 1
内容的提问来源于stack exchange,提问作者John Mathew
相关产品推荐
相关产品推荐

