PostgreSQL:筛选不含指定field_name值的唯一some_id
解决方法:筛选无指定field_name值的唯一some_id
嘿,这个问题其实有好几种实用的SQL解法,我给你一一拆解:
方法1:使用NOT IN子查询
这是最直观的思路——先找出所有包含目标field_name(比如kevin)的some_id,再从总列表里排除这些id。
SELECT DISTINCT some_id FROM your_table_name WHERE some_id NOT IN ( SELECT some_id FROM your_table_name WHERE field_name = 'kevin' );
逻辑说明:子查询先抓取所有关联kevin的some_id(这里就是201),外层查询再筛选不在这个集合里的唯一some_id,最终得到200和203。
方法2:LEFT JOIN + IS NULL
用左连接的方式,把原表和含目标值的子表关联,然后筛选出匹配不到的记录(也就是没有目标值的some_id)。
SELECT DISTINCT t1.some_id FROM your_table_name t1 LEFT JOIN ( SELECT some_id FROM your_table_name WHERE field_name = 'kevin' ) t2 ON t1.some_id = t2.some_id WHERE t2.some_id IS NULL;
逻辑说明:左连接后,t2.some_id为NULL的行,就对应那些完全没有kevin的some_id,去重后就是你要的结果。
方法3:GROUP BY + HAVING
按some_id分组,直接统计分组内是否存在目标field_name,过滤掉存在的分组。
SELECT some_id FROM your_table_name GROUP BY some_id HAVING COUNT(CASE WHEN field_name = 'kevin' THEN 1 END) = 0;
逻辑说明:CASE语句会给每个分组里等于kevin的行计数,如果计数为0,说明这个some_id下完全没有kevin,直接符合筛选条件。这种方法不需要子查询,代码更紧凑。
注意:把代码里的'kevin'换成你需要排除的任意field_name值即可,这几种方法在MySQL、PostgreSQL、SQL Server等主流数据库都能正常运行。
内容的提问来源于stack exchange,提问作者Tyson
相关产品推荐
相关产品推荐

