我有兩個表A和B.在不使用子查詢的情況下編寫查詢
它們通過一個名爲id的公共字段連接。表B還有一個字段post_code和一個附加到該post_code的日期,這意味着post_code首次輸入到數據庫中。
我需要選擇最新的郵政編碼並將其連接到表A上的一行,而不需要子查詢。
我有一個子查詢解決方案,但它採取了太久
TIA
我有兩個表A和B.在不使用子查詢的情況下編寫查詢
它們通過一個名爲id的公共字段連接。表B還有一個字段post_code和一個附加到該post_code的日期,這意味着post_code首次輸入到數據庫中。
我需要選擇最新的郵政編碼並將其連接到表A上的一行,而不需要子查詢。
我有一個子查詢解決方案,但它採取了太久
TIA
您可以嘗試使用APPLY
Create Table #A(Id int)
Create Table #B(Id int, AId int, PostCode VARCHAR(10), DateAdded DATE)
Insert into #A
Values(1),(2)
Insert into #B
Values(1,1,'NW1', GETDATE()-100),
(2,1,'S20', GETDATE()-200)
Select *
From #A A
CROSS APPLY(SELECT TOP 1 B.*
FROM #B B
WHERE A.Id = B.AId
ORDER BY DateAdded DESC) Latest
不錯,謝謝。我以前沒有遇到過交叉申請。 – user2573436
@ user2573436:這是你之後的事情嗎?你的問題並不清楚 –
我對SQL概念有點朦朧,所以我的問題可能不是最清楚的。我應用了您的解決方案,並提出了我正在尋找的確切答案,歡呼。 – user2573436
份額查詢在這裏,它給更多clearity –
我能想到的唯一提供解決方案的DBMS是帶有'DISTINCT ON'的PostgreSQL。所有其他DBMS需要一個子查詢,可以通過過濾'ROW_NUMBER'結果或使用'MAX(date)'子查詢或應用'CROSS APPLY'或'LATERAL'子查詢。你使用的是什麼DBMS,是什麼讓你認爲你不能使用子查詢? –
我正在使用SQL Server。我在表A中有超過100萬行。在子查詢解決方案中,這意味着每行的子查詢。正如我在我的問題中所說的那樣,時間太長了。 對於服務器較大的人來說,這可能不是問題,但我必須和我坐在我對面的同事一起玩:) – user2573436