[英]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
如果我理解正確,您希望通過某些列集(顯然是AssetName
和TicketNumber
)對結果集進行重復數據刪除。 由於 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.