【发布时间】:2018-06-15 18:03:36
【问题描述】:
我正在尝试在此查询中添加CROSS APPLY。我以前从未做过,但一位同事建议这样做,这似乎是有道理的。我收到了一个语法错误。这是查询:
SELECT
i.IncidentID,
i.AccountID,
i.IncidentTypeID,
i.IncidentStateID,
i.CreateDate,
i.LastModifyDate,
i.LastModifyUser,
(
SELECT
COUNT(*)
FROM
Actions a
WHERE
a.IncidentID = i.IncidentID
) AS ActionCount
CROSS APPLY
(
SELECT TOP 1
a.IncidentStateID,
a.LastModifyDate
FROM Actions a
WHERE a.IncidentID = i.IncidentID
ORDER BY a.LastModifyDate DESC
)
FROM
Incidents i
WHERE i.IncidentTypeID = 44
AND i.IncidentStateID = 7
AND i.CreateDate >= ?
AND i.CreateDate < ?
最终我需要获得最近发生事件的“Action”的a.IncidentStateID 和 a.LastModifyDate。这就是为什么它按 DESC 排序并只选择前 1 个。任何人都会看到语法问题。错误只是说General error: 20018 Incorrect syntax near the keyword 'ORDER'.。如果我删除它,它会转到另一段语法,依此类推。
【问题讨论】:
-
此链接可能会有所帮助:stackoverflow.com/a/1139231/9236062
-
我不清楚为什么这里可能需要 CROSS APPLY。
Incidents和Actions之间有关系吗? CROSS APPLY 不会为您提供事件的最新行动。 CROSS APPLY 用于表之间没有共享键域的情况。 -
有关系。老实说,我不确定。我的同事说这是要走的路。我确实知道事件和操作之间存在一对多的关系,但由于我只获取最近的操作,因此重复不会成为问题。肯定会考虑走另一条路。
-
我想您可能正在寻找 CTE。
标签: sql sql-server database cross-apply