求助:如何过滤SQL查询结果,仅保留指定vf_id的匹配记录
解决方案:筛选同时关联st_id=10和11的vf_id记录
看起来你想要的是只保留那些同时对应st_id=10和st_id=11的vf_id,去掉仅关联其中一个st_id的条目(比如你的结果里的vf_id=2和3)对吧?这里有两种常用的SQL写法可以实现你的需求:
方法1:子查询+分组筛选
先通过子查询找出满足条件的vf_id,再关联原表获取对应记录:
SELECT t.vf_id, t.st_id FROM your_table t WHERE t.vf_id IN ( -- 筛选出同时关联10和11的vf_id SELECT vf_id FROM your_table WHERE st_id IN (10, 11) GROUP BY vf_id HAVING COUNT(DISTINCT st_id) = 2 ) AND t.st_id IN (10, 11) ORDER BY t.vf_id, t.st_id;
原理:子查询里对vf_id分组,通过HAVING COUNT(DISTINCT st_id) = 2确保这个vf_id同时存在st_id=10和11的记录,再用这个vf_id列表去原表过滤,就能得到你想要的结果。
方法2:窗口函数筛选
用窗口函数直接给每个vf_id标记关联的st_id数量,再过滤:
SELECT vf_id, st_id FROM ( SELECT vf_id, st_id, -- 计算每个vf_id关联的不同st_id数量 COUNT(DISTINCT st_id) OVER (PARTITION BY vf_id) AS st_count FROM your_table WHERE st_id IN (10, 11) ) sub_query WHERE st_count = 2 ORDER BY vf_id, st_id;
原理:窗口函数PARTITION BY vf_id会给每个vf_id分组计算关联的不同st_id总数,之后只保留总数为2的记录,就能得到目标结果。
这两种方法都能帮你得到期望的输出:
vf_id --> st_id -------------- 1 --> 10 1 --> 11
内容的提问来源于stack exchange,提问作者AnCo ngCo Danh Bun
相关产品推荐
相关产品推荐

