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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:44:54