簡體   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