如何在PostgreSQL的sval表中筛选未关联fid=903的id?
正确查询未关联fid=903的id方案
以下是几种可行的PostgreSQL查询方案,能精准筛选出从未关联过fid=903的id:
方法1:NOT EXISTS子查询
通过子查询排除所有存在fid=903关联的id:
SELECT DISTINCT id FROM sval s1 WHERE NOT EXISTS ( SELECT 1 FROM sval s2 WHERE s2.id = s1.id AND s2.fid = 903 );
- 逻辑:子查询找出所有关联过903的id,外层查询返回不在这个范围内的id,
DISTINCT确保每个id仅返回一次。
方法2:LEFT JOIN + 空值筛选
利用左连接特性,筛选出无法匹配fid=903关联的id:
SELECT DISTINCT s1.id FROM sval s1 LEFT JOIN sval s2 ON s1.id = s2.id AND s2.fid = 903 WHERE s2.id IS NULL;
- 逻辑:左连接后,未关联903的id对应的
s2.id会为NULL,以此作为筛选条件。
方法3:GROUP BY + HAVING统计
分组统计每个id的fid记录,排除包含903的分组:
SELECT id FROM sval GROUP BY id HAVING COUNT(CASE WHEN fid = 903 THEN 1 END) = 0;
- 逻辑:
CASE语句仅对fid=903的记录计数,结果为0说明该id没有任何903的关联记录,无需额外去重。
内容的提问来源于stack exchange,提问作者Patrick Chong
相关产品推荐
相关产品推荐

