You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选TABLE_1关联TABLE_2后Status全为'A'的唯一ID?

问题分析与解决方案

原SQL的问题出在JOIN条件里提前过滤了b.status='A'——这直接导致后续分组统计时,只能看到该ID下Status为'A'的记录,完全忽略了TABLE_2中同一ID下存在非'A'状态的情况。比如ID=2在TABLE_2里有一条Status='B'的记录,但JOIN时只取了Status='A'的那条,分组后SUM的A数量等于当前count(*)(也就是1),自然会被错误地包含进结果。

要实现需求,需要同时满足两个核心条件:

  • TABLE_1中每条(ID,Gen_ID)都能在TABLE_2中找到匹配项(确保关联关系成立)
  • 该ID在TABLE_2中所有对应的Status全为'A'

正确写法示例

写法一:先排除有非A状态的ID,再关联TABLE_1

SELECT DISTINCT a.ID
FROM TABLE_1 a
INNER JOIN TABLE_2 b ON a.ID = b.ID AND a.Gen_ID = b.Gen_ID
WHERE a.ID NOT IN (
    SELECT DISTINCT ID 
    FROM TABLE_2 
    WHERE Status != 'A'
);

写法二:分组验证所有状态均为A,同时确保TABLE_1的记录全匹配

SELECT a.ID
FROM TABLE_1 a
INNER JOIN TABLE_2 b ON a.ID = b.ID AND a.Gen_ID = b.Gen_ID
GROUP BY a.ID
-- 确保TABLE_1中该ID的所有Gen_ID都在TABLE_2中匹配到
HAVING COUNT(DISTINCT a.Gen_ID) = (SELECT COUNT(DISTINCT Gen_ID) FROM TABLE_1 WHERE ID = a.ID)
-- 确保该ID在TABLE_2中没有非A状态
AND MAX(b.Status) = 'A' AND MIN(b.Status) = 'A';

写法三:用分组统计非A数量为0

SELECT DISTINCT a.ID
FROM TABLE_1 a
INNER JOIN TABLE_2 b ON a.ID = b.ID AND a.Gen_ID = b.Gen_ID
GROUP BY a.ID
HAVING SUM(CASE WHEN b.Status != 'A' THEN 1 ELSE 0 END) = 0
-- 额外验证TABLE_1的Gen_ID全匹配TABLE_2(如果需求要求TABLE_1的每条记录都必须在TABLE_2有对应)
AND COUNT(DISTINCT a.Gen_ID) = (SELECT COUNT(DISTINCT Gen_ID) FROM TABLE_1 WHERE ID = a.ID);

关键说明

  • 如果默认TABLE_1的所有(ID,Gen_ID)都一定存在于TABLE_2中,可去掉最后验证Gen_ID数量的条件;若需严格确保匹配,必须保留。
  • 原SQL的DISTINCT和GROUP BY重复,分组后直接选a.ID即可,不需要DISTINCT。

内容的提问来源于stack exchange,提问作者Boosted Nero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:57:32