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
这将简化您的查询。
我有一个问题...
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
这将简化您的查询。