繁体   English   中英

返回超过 1 行的子查询:SQL 服务器

[英]Sub-query returning more than 1 row: SQL Server

返回多于 1 行的子查询。

我当前的 SQL 服务器查询如下所示

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

目前我的 output 如下所示。

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

我不想单独打印第二行,但仍然需要 output 的第三行,左连接下方返回多行。 我想一个人坐第一排。

LEFT JOIN pmm.PmmLogChange AS PLC With (nolock) ON PRR.ManagedAccountID = PLC.ManagedAccountID and PRR.ExpiresDt < PLC.ChangeDt

如果我理解正确,您希望通过某些列集(显然是AssetNameTicketNumber )对结果集进行重复数据删除。 由于 SQL 服务器缺少DISTINCT ON运算符,我建议您使用此处描述的以下技巧

您基本上使用像这样的行号填充投影中的每一行ROW_NUMBER() OVER(PARTITION BY <whatever columns you consider as deduplication keys like AssetName,TicketNumber, ...>)然后过滤掉所有ROW_NUMBER() > 1的行使用DISTINCT运算符。 顺便说一句,我同意@marc_s,你不应该像你一样使用NOLOCK

但是,如果问题仅在于最后一个连接,您可以用这样的子查询替换它(SELECT TOP 1... FROM pmm.PmmLogChange AS PLC WHERE PRR.ManagedAccountID = PLC.ManagedAccountID AND PRR.ExpiresDt < PLC.ChangeDt ORDER BY PLC.ChangeDt ASC) AS mngac

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM