簡體   English   中英

SQL Server LEFT JOIN中的OR子句導致高邏輯讀取

[英]OR Clause in SQL Server LEFT JOIN causing high logical reads

如何通過消除OR子句來重寫以下查詢

SELECT T1.Name, T1.Value-T2.value as value 
FROM TABLE1 T1 LEFT JOIN TABLE2 T2 ON T2.ID=T1.ID OR T2.OLD_ID=T1.ID

這回答了原始問題。

OR在聯接中引起重大問題。 您可以非常輕松地解決此查詢。 基本上,這應該做您想要的:

SELECT T1.*
FROM TABLE1 T1;

為什么? 您沒有從第二個表中選擇任何行,並且LEFT JOIN將所有行保留在第一個表中。 可能存在重復的行,但我猜測您不希望重復(這是我的假設)。

嘗試IN

SELECT T1.name, T1.value - T2.value AS value
FROM TABLE1 T1
LEFT JOIN TABLE2 T2 ON T1.ID IN (T2.ID, T2.OLD_ID)

編輯

具有多個LEFT JOIN的另一個版本:

SELECT T1.name, T1.value - COALESCE(T2A.value, T2B.value) AS value
FROM TABLE1 T1
LEFT JOIN TABLE2 T2A ON T1.ID = T2.ID
LEFT JOIN TABLE2 T2B ON T1.ID = T2.OLD_ID

另一個版本:

SELECT T1.name, T1.value - T2.value AS value
FROM TABLE1 T1
LEFT JOIN ( SELECT ID, value FROM TABLE2 UNION
            SELECT OLD_ID, value FROM TABLE2 ) T2 ON T1.ID = T2.ID

這是另一種編寫方式,盡管我不知道是否會影響邏輯讀取:

SELECT T1.Name, T1.Value-T2.value as value 
FROM TABLE1 T1 
LEFT JOIN TABLE2 T2 
 ON T2.ID=T1.ID 
UNION ALL 
SELECT T1.Name, T1.Value-T2.value as value 
FROM TABLE1 T1 
LEFT JOIN TABLE2 T2 
 ON T2.ID<>T1.ID
 AND T2.OLD_ID=T1.ID

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM