sql - 使用 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?
解决方案
我想你想要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
这将简化您的查询。
推荐阅读
- javascript - 无法从数组中设置引导选择的多个值
- laravel - laravel 中的 AdminLTE 多重身份验证
- powershell - 为什么不同的 Get-ChildItem 过滤方式会给出实际上不同的相同对象?
- python - 如何索引具有形状 (batch_size, 200, 256) 的张量以获得 (batch_size, 1, 256) 给定长度 = batch_size 的索引张量列表?
- sass - Sass:仅返回具有唯一字符的列表值
- java - 当我们在 Spring Boot 中对 Scope Protype 使用代理模式时,原型 bean 的对象何时会被垃圾收集
- c++ - 如何获得给定矩阵的最大和?
- android - 如何在应用中心测量和记录应用启动时间?
- typescript - 如何在 TypeScript 中表达正确类型的消息队列?
- scala - java.lang.ClassCastException:java.lang.String 不能转换为 scala.collection.Seq