加入OR条件需要很长时间

时间:2015-02-20 19:30:45

标签: sql sql-server sql-server-2008

我有一个选择过程,在选择查询中我使用如下的连接。

select * from Table1 t1

Left join Table2 t2 on t1.ID = t2.ID

OR (t1.col1     = t2.col1

AND t1.col2     = t2.col2

AND t1.col3         = t2.col3

AND t2.ID IS NULL
)

此OR条件使插入过程非常慢。有没有其他方法可以让OR条件到另一个连接以使进程快速。

由于 [R

3 个答案:

答案 0 :(得分:1)

OR条件通常会在某种程度上影响性能。你可以用这个:

Select * from table1 t1 Left Join table2 t2 on t1.ID = T2.ID
Union All
Select * from Table1 t1 Left Join Table2 t2 on t1.col1 = t2.col1 AND t1.col2 = t2.col2 and t1.col3 = t2.col3 AND t2.ID IS NULL

希望这会有所帮助!!

答案 1 :(得分:1)

嗯,是的,您可以使用第二个联接而不是OR

select * from Table1 t1

Left join Table2 t2 on t1.ID = t2.ID
left join table2 t3 on 

 (t1.col1     = t3.col1

AND t1.col2     = t3.col2

AND t1.col3         = t3.col3

AND t3.ID IS NULL
)

您在table2中插入的任何内容都需要与第二个别名合并(coalesce(t2.col1,t3.col1))。

现在,这是否会对你的表现做任何事情完全是另一个问题。

答案 2 :(得分:1)

您可以使用union all。注意第一个选择中的内连接 - 这使得两个选择真正互补于与原始中的任何OR条件匹配的记录。如果两者都失败,则Table1中的相应记录将由第二个选择中的左连接保留。

    select *
      from Table1 t11
      join Table2 t21 on ( t21.ID = t11.ID )
 union all
    select *
      from Table1 t12
 left join Table2 t22  on (        t22.ID   IS NULL
                               AND t22.col1 = t12.col1
                               AND t22.col2 = t12.col2
                               AND t22.col3 = t12.col3
                             )
         ;