我有两个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