我有兩個tables
右外連接與OR條件和空在where子句 - SQL SERVER
table1
和table2
我有一個查詢,如下
select val1, val2 , val3
FROM table1
RIGHT OUTER JOIN
table2
on (table1.key = table2.key)
AND (table2.val1 IN (select val1 from data where datadate between @stdate and @enddate) or (table2.val1= 0 and table2.val2 =5))
WHERE table2.key IS NULL
此查詢運行非常緩慢
所以,我試圖去優化它下面的方式
with cte
as
(
select key
from table2
where
(table2.val1 IN (select val1 from data where datadate between @stdate and @enddate) or (table2.val1= 0 and table2.val2 =5))
)
select val1, val2 , val3
FROM table1
RIGHT OUTER JOIN
cte
on (table1.key = cte.key)
WHERE cte.key IS NULL
還有查詢的性能沒有太大的改善。所以我試圖用CUL替換Union中的OR clause
。它改進了查詢performance
但給出了不同的結果。
with cte
as
(
select key
from table2
Inner join data
on (data.val1 = table2.val1)
union
select key
from
table2 where val1 = 0 and val = 5
)
select val1, val2 , val3
FROM table1
RIGHT OUTER JOIN
cte
on (table1.key = cte.key)
WHERE cte.key IS NULL
是否更換OR clause
與UNION
一個正確的方法?此外,在WHERE
clause
有NULL
條件從LEFT table
消除所有記錄。那麼,在Join
期間添加OR
子句會有什麼影響?
我不明白您的查詢,第一,是什麼是'AND(table2.val1(...'?它是沒有意義的編譯。第二,你從'data'選擇'val1'是什麼?只有1條記錄從那裏返回?在你的第三個查詢中, 「table1」去哪裏了? – sagi
你的UNION與其他人的查詢不同,它選擇加入data.val的所有記錄1 = table2.val1,加上其他記錄。在你的第一個查詢中,ON條件使用一個AND,而不是OR - 所以它不能和我所見到的一樣 – Cato
@Sagi我錯過了查詢中的IN子句。數據表返回多條記錄......我編輯了這個問題 – bmsqldev