【问题标题】:Sub-Query Should return Null when comparing it to the Next rows from the different table子查询在将其与不同表中的下一行进行比较时应返回 Null
【发布时间】: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


【解决方案1】:

row_num 是这样定义的:

    ROW_NUMBER() OVER (PARTITION BY PMA.AssetName, ReleaseDt, ExpiresDt, TicketNumber, ChangeReasonCd 
                       ORDER BY ChangeDt ASC) AS ROW_NUM 

它将为PARTITION BY 中列的每个唯一组合返回一行。即每 PMA.AssetName / ReleaseDt / ExpiresDt / TicketNumber / ChangeReasonCd 一行。

我希望这样的组合不止一种。

如果您只想要一行,请使用SELECT TOP (1)OFFSET/FETCH

【讨论】:

  • ChangeDt 具有不同的值。我尝试了它只返回一行的选项。上面的查询确实可以正常工作,但扩展并尝试添加更多其他条件。
  • @tata 。 . .这解决了您在此处提出的问题,这就是您获得不止一排的原因。如果您需要查询方面的帮助,请提出一个问题,其中包含示例数据、所需结果以及您尝试实现的逻辑的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多