我有三個表:涉及子查詢的SQL Server查詢 - 性能問題
表1: dbo.pc_a21a22 |
batchNbr Other columns...
-------- ----------------
12345
12346
12347
表2: dbo.outcome |
passageId record
---------- ---------
00003 200
00003 9
00004 7
表3: dbo.passage |
passageId passageTime batchNbr
---------- ------------- ---------
00001 2015.01.01 12345
00002 2016.01.01 12345
00003 2017.01.01 12345
00004 2018.01.01 12346
我想要做的:每個batchNbr表1中獲得第一的最新passageTime從表3的相應passageID隨着該passageID,得到相關的行表2和確定是否所有這些行包含記錄200.每個通道Id最多有2個記錄在表2中
執行此操作的最有效方法是什麼?
我已經創建了一個可以工作的查詢,但它非常慢,因此不適合具有數百萬行的表。任何關於如何更改查詢或以其他方式執行的建議?改變表結構不是一種選擇,我只有讀取數據庫的權限。
我目前的解決方案(慢):
SELECT TOP 50000
a.batchNbr,
CAST (CASE WHEN 200 in (SELECT TOP 2 record FROM dbo.outcome where passageId in (
SELECT SubqueryResults.passageId From (SELECT Top 1 passageId FROM dbo.passage pass WHERE pass.batchNbr = a.batchNbr ORDER BY passageTime Desc) SubqueryResults
)
) then 1 else 0 end as bit) as KGT_IO_END
FROM dbo.pc_a21a22 a
所需的輸出是:
batchNbr 200present
--------- ----------
12345 1
12346 0
它必須是'選擇*'。 - 而不是'選擇* .a' .....但除此之外:完美的迴應! –
謝謝!爲什麼表現有很大的差異? – AlexGuevara
@marc_s - 謝謝先生!錯過了那一個。 –