[英]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.