首页 > 解决方案 > 使用 CROSS APPLY 的 SQL Server 查询包括没有 CROSS APPLied 表的行

问题描述

我有一个查询...

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和一个 CROSS APPLY,它CompletionDate根据最近修改的操作设置 a。这是有效且准确的,尽管问题是它忽略了没有动作的事件,所以我的结果集被截断并预期为 25 到 5。关于如何清理它以获得设置 ActionCount 的结果的任何想法, CompletionDate 并且没有遗漏 Incidents without Actions?

标签: sqlsql-serverdatabasecross-apply

解决方案


我想你想要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

这将简化您的查询。


推荐阅读