SQL无需存储过程实现:主表关联明细表返回全True/False结果
无需存储过程实现主表关联明细表的全访问判断
可以完全通过单条SQL查询实现需求,不需要存储过程,以下提供两种高效的实现方式:
方法一:LEFT JOIN + 聚合函数
利用聚合函数判断是否存在Visited=False的记录,逻辑清晰直观:
SELECT t1.ID, t1.Name, -- 若该ID无明细记录或所有Visited均为True则返回True,否则返回False CASE WHEN NOT EXISTS (SELECT 1 FROM Table2 t2 WHERE t2.ID = t1.ID) THEN True WHEN SUM(CASE WHEN t2.Visited = False THEN 1 ELSE 0 END) = 0 THEN True ELSE False END AS AllVisited FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.ID = t2.ID GROUP BY t1.ID, t1.Name;
逻辑说明:
- 通过
LEFT JOIN保留主表Table1的所有记录 - 用
SUM(CASE...)统计Visited=False的记录数,若为0则说明所有记录均为True - 额外处理了主表ID在明细表中无对应记录的场景(可根据实际需求调整返回值)
方法二:EXISTS子查询(性能更优)
利用NOT EXISTS直接判断是否存在Visited=False的记录,找到匹配项后立即终止子查询,性能更高效:
SELECT t1.ID, t1.Name, -- 不存在Visited=False的记录则返回True,否则返回False NOT EXISTS ( SELECT 1 FROM Table2 t2 WHERE t2.ID = t1.ID AND t2.Visited = False ) AS AllVisited FROM Table1 t1;
逻辑说明:
- 对主表每条记录,检查明细表中是否存在同ID且
Visited=False的记录 - 若不存在则返回
True(包括明细表无对应ID的情况),存在则返回False
两种方法都能得到你期望的输出结果:
1,A,True 2,B,False 3,C,False
内容的提问来源于stack exchange,提问作者A3006
相关产品推荐
相关产品推荐

