如何筛选数据库中无fid=1250行记录的id列表?
筛选不存在指定fid记录的id方法
需求:从以下数据表片段中,筛选出没有fid=1250行记录的id(示例中44294、44295符合要求):
id fid ts val 44292 1243 2014-12-15 00:00:00.000 True 44292 1243 2017-02-02 00:00:00.000 False 44292 1250 2014-12-16 00:00:00.000 ABC 44293 1243 2014-12-15 00:00:00.000 True 44293 1243 2017-02-02 00:00:00.000 False 44293 1250 2014-12-16 00:00:00.000 KKK 44294 1243 2014-12-15 00:00:00.000 True 44294 1243 2017-02-02 00:00:00.000 False 44295 1243 2014-12-15 00:00:00.000 True 44295 1243 2017-02-02 00:00:00.000 False
下面提供几种可行的SQL实现方式:
方法1:NOT EXISTS子查询
这是最直观的写法,直接排除掉存在fid=1250记录的id:
SELECT DISTINCT id FROM your_table t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.id = t1.id AND t2.fid = 1250 );
DISTINCT用于去重,确保每个id只返回一次。
方法2:LEFT JOIN + IS NULL
通过左连接匹配目标记录,筛选未匹配成功的id:
SELECT DISTINCT t1.id FROM your_table t1 LEFT JOIN your_table t2 ON t1.id = t2.id AND t2.fid = 1250 WHERE t2.id IS NULL;
左连接后,没有对应fid=1250记录的行,t2的字段会是NULL,以此作为筛选条件。
方法3:GROUP BY + HAVING统计
按id分组后,统计每个id下fid=1250的行数,筛选行数为0的id:
SELECT id FROM your_table GROUP BY id HAVING SUM(CASE WHEN fid = 1250 THEN 1 ELSE 0 END) = 0;
这种写法不需要额外去重,因为GROUP BY本身就会把id合并成唯一值。
以上三种方法在主流数据库(MySQL、PostgreSQL、SQL Server等)中都能正常运行,可根据实际表数据量和性能需求选择。
内容的提问来源于stack exchange,提问作者user21641220
相关产品推荐
相关产品推荐

