编写SQL查询:获取关联B、C表无approved_status=2的Table A记录
核心筛选逻辑拆解
两个约束需要同时满足,无优先级区别:
- 对A表的任意记录,所有关联的B表记录中,不存在
approved_status = 2的条目(因为A和B是一对多关系,只要有任意一条B关联记录状态为2,无论其他B记录状态是什么,该A记录都不符合要求) - 对A表的任意记录,关联的C表记录中(A和C为一对一关系),不存在
approved_status = 2的条目
注意:直接用INNER JOIN关联B表做筛选容易出现行重复、逻辑偏差,优先使用反存在判断的写法规避这类问题,同时这类写法在关联表数据量较大时查询性能更优。
标准查询SQL
SELECT a.id, a.Text_message_to_show FROM TableA a -- 校验B表关联规则 WHERE NOT EXISTS ( SELECT 1 FROM TableB b WHERE b.request_id = a.id AND b.approved_status = 2 ) -- 校验C表关联规则 AND NOT EXISTS ( SELECT 1 FROM TableC c WHERE c.request_id = a.id AND c.approved_status = 2 );
样例数据校验结果
结合给出的测试数据逐一匹配规则:
- A表id=1的记录:B表存在id=101的关联记录
approved_status=2,C表存在id=501的关联记录approved_status=2,不满足规则,被过滤 - A表id=2的记录:B表的两条关联记录(id=103、104)均为
approved_status=2,不满足B表的规则,被过滤
最终查询返回空结果集,和规则匹配结果完全一致。
业务场景适配说明:
上述写法默认支持「A表记录无关联B/C表记录」的场景——这种场景下因为不存在状态为2的关联条目,会被判定为符合要求。如果业务要求A表必须在B、C表存在有效关联才能被纳入结果,只需要在WHERE子句中补充对应存在判断即可:-- 强制要求A记录必须有B、C关联 AND EXISTS (SELECT 1 FROM TableB b WHERE b.request_id = a.id) AND EXISTS (SELECT 1 FROM TableC c WHERE c.request_id = a.id)
内容的提问来源于stack exchange,提问作者hari vallabh shukla
相关产品推荐
相关产品推荐

