SQL 使用 CROSS APPLY 的服务器查询包括没有 CROSS APPLied 的行 table

SQL Server query with CROSS APPLY that includes rows that do not have the CROSS APPLied table

我有一个问题...

SELECT
i.IncidentID,
i.AccountID,
i.IncidentTypeID,
i.IncidentStateID,
i.CreateDate,
i.LastModifyDate,
i.LastModifyUser,
t.LastModifyDate AS CompletionDate,
(
    SELECT
        COUNT(*)
    FROM
        Actions a
    WHERE
        a.IncidentID = i.IncidentID
) AS ActionCount
FROM
Incidents i CROSS APPLY(
    SELECT
        TOP (1) a.LastModifyDate
    FROM
        Actions a
    WHERE a.IncidentID = i.IncidentID
    ORDER BY
        a.LastModifyDate DESC
) t
WHERE
i.IncidentTypeID = 44
AND i.IncidentStateID = 7

...这就是获取所有 Incidents 和他们的 Actions。有一个子查询正在获取 ActionCount 和一个基于最近修改的操作设置 CompletionDate 的 CROSS APPLY。这是有效且准确的,尽管问题是它忽略了没有操作的事件,因此我的结果集被截断并预期为 25 到 5。关于如何清理它以获得设置 ActionCount 的结果的任何想法, CompletionDate 并且不会遗漏没有操作的事件?

我想你想要 outer apply:

FROM Incidents i OUTER APPLY
     (SELECT TOP (1) a.LastModifyDate
      FROM Actions a
      WHERE a.IncidentID = i.IncidentID
      ORDER BY a.LastModifyDate DESC
     ) t

我很好奇你为什么不删除 SELECT 中的子查询并使用:

FROM Incidents i OUTER APPLY
     (SELECT MAX(a.LastModifyDate) as LastModifyDate, COUNT(*) as ActionCount
      FROM Actions a
      WHERE a.IncidentID = i.IncidentID
     ) t

这将简化您的查询。