【发布时间】:2020-05-03 10:01:18
【问题描述】:
我的 T-SQL 子查询返回超过 1 行:
WITH ReportView AS
(
SELECT
PMA.AssetName, ReleaseDt, ExpiresDt, TicketNumber, ChangeDt,
ChangeReasonCd,
ROW_NUMBER() OVER (PARTITION BY PMA.AssetName, ReleaseDt, ExpiresDt, TicketNumber, ChangeReasonCd
ORDER BY ChangeDt ASC) AS ROW_NUM
FROM
pmm.pmmreleaserequest PRR WITH (nolock)
LEFT JOIN
pmm.PmmManagedAccount AS PMA WITH (nolock) ON PRR.ManagedAccountID = PMA.ManagedAccountID
LEFT JOIN
dbo.ManagedEntity AS ME WITH (nolock) ON PRR.ManagedSystemID = ME.ManagedEntityID
LEFT JOIN
dbo.Asset AS AST WITH (nolock) ON ME.AssetID = AST.AssetID
LEFT JOIN
pmm.PmmLogChange AS PLC WITH (nolock) ON PRR.ManagedAccountID = PLC.ManagedAccountID
AND PRR.ExpiresDt < PLC.ChangeDt
)
SELECT *
FROM ReportView
WHERE ROW_NUM = 1
如何比较 ChangeDt 的当前行与 ReleaseDt 的下一行。示例 ChangeDt(当前行)
【问题讨论】:
-
ROW_NUM是一个 数字 值 - 因此WHERE子句应该是WHERE ROW_NUM = 1- 做 NOT 为数值添加不必要的单引号!您只是从 字符串值 ('1') 产生(完全不必要的)隐式转换回数值 (1) ... -
另外:参见Bad Habits to kick - putting NOLOCK everywhere - 不建议在任何地方使用它 - 恰恰相反!
标签: sql sql-server lead