SQL Server查询:获取关联子项状态均为1的事件
正确实现方式梳理
首先明确你的核心需求:筛选出名称为"Meet",且关联的所有tbl_items记录状态全为1的事件。你的原SQL语句缺少了Name='Meet'的筛选条件,而且表名可能存在笔误(TBL_VMS_LENT_ITEMS应该是tbl_items吧?),下面给你几种靠谱的实现方式:
方式一:NOT EXISTS(推荐,性能更优)
这种方式直接检查目标事件是否不存在任何状态为0的子项,逻辑清晰且高效:
SELECT E.* FROM Tbl_Events E WHERE E.Name = 'Meet' AND NOT EXISTS ( SELECT 1 FROM tbl_items L WHERE L.EventId = E.EventId AND L.Status = 0 )
- 逻辑:先锁定所有"Meet"事件,再确保这些事件没有任何子项的status是0(等价于所有子项status都是1)。如果某个"Meet"事件没有关联的子项,也会被包含进来——如果不需要这种情况,可以再加一个
EXISTS (SELECT 1 FROM tbl_items L WHERE L.EventId = E.EventId)的条件。
方式二:分组聚合+HAVING
通过分组统计每个EventId的最小状态值,判断是否全为1:
SELECT E.* FROM Tbl_Events E INNER JOIN ( SELECT EventId FROM tbl_items GROUP BY EventId HAVING MIN(Status) = 1 -- 如果要求必须至少有一个子项,再加下面这行: -- AND COUNT(*) > 0 ) L ON E.EventId = L.EventId WHERE E.Name = 'Meet'
- 逻辑:子查询先找出所有子项状态全为1的EventId(因为MIN(Status)=1意味着没有0),再和事件表关联筛选出"Meet"事件。
方式三:修正你的原NOT IN写法
如果想用你最初的思路,需要补全筛选条件并修正表名,同时加上DISTINCT避免重复结果:
SELECT DISTINCT E.* FROM Tbl_Events E INNER JOIN tbl_items L ON E.EventId = L.EventId WHERE E.Name = 'Meet' AND E.EventId NOT IN ( SELECT EventId FROM tbl_items WHERE Status = 0 )
- 注意:
NOT IN在子查询返回NULL时会有异常,所以如果tbl_items的EventId可能为NULL,更推荐用NOT EXISTS的方式。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

