子查询返回1行以上:SQL Server

问题描述 投票:0回答:1

子查询返回多于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
sql sql-server sql-server-2008
1个回答
0
投票

如果我正确地理解了这一点,则希望通过某些列集(显然是AssetNameTicketNumber)对结果集进行重复数据删除。由于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

© www.soinside.com 2019 - 2024. All rights reserved.