子查询返回多于1行。
我当前的SQL Server查询看起来像这样
SELECT DISTINCT AST.AssetName
,ReleaseDt
,ExpiresDt
,TicketNumber
,ChangeDt
,ChangeReasonCd
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
ORDER BY PLC.ChangeDt ASC
目前,我的输出如下所示。
AssetName ReleaseDt ExpiresDt TicketNumber ChangeDt ChangeReasonCd
DummyAsset66 2020-05-02 17:45:38 2020-05-02 17:45:52 dummyticketx1 2020-05-02 17:50:06 U
***DummyAsset66 2020-05-02 17:45:38 2020-05-02 17:45:52 dummyticketx1 2020-05-02 18:26:06 U***
DummyAsset66 2020-05-02 18:23:12 2020-05-02 18:23:59 dummyticketx2 2020-05-02 18:26:06 U
我不想单独打印第二行,但仍需要输出中的第三行,在Left Join下面返回多一行,我想单独打印第一行。请帮助
LEFT JOIN pmm.PmmLogChange AS PLC With (nolock) ON PRR.ManagedAccountID = PLC.ManagedAccountID and PRR.ExpiresDt < PLC.ChangeDt
如果我正确地理解了这一点,则希望通过某些列集(显然是AssetName
和TicketNumber
)对结果集进行重复数据删除。由于SQL Server缺少DISTINCT ON
运算符,因此建议您按照here]的说明使用以下技巧
您基本上在投影中的每一行都用像ROW_NUMBER() OVER(PARTITION BY <whatever columns you consider as deduplication keys like AssetName,TicketNumber, ...>)
这样的行号填充,然后用ROW_NUMBER() > 1
而不是DISTINCT
运算符过滤掉所有行。顺便说一句,我同意@marc_s,您不应该像您一样使用NOLOCK