SQL命令用法in /或

时间:2014-05-27 12:47:43

标签: sql foxpro

我有一个类似于下面的sql命令。

select * from table1 
where table1.col1 in (select columnA from table2 where table2.keyColumn=3) 
or table1.col2 in (select columnA from table2 where table2.keyColumn=3)

它的性能非常差,所以如何更改此命令? (请注意,paranthesis中的两个sql命令完全相同。)

4 个答案:

答案 0 :(得分:2)

这是您的查询:

select *
from table1
where table1.col1 in (select columnA from table2 and t2.keyColumn = 3) or
      table1.col2 in (select columnA from table2 and t2.keyColumn = 3);

可能最好的方法是在table2(keyColumn, columnA)上建立一个索引。

in也可能具有较差的性能特征。因此,您可以尝试将其重写为exists查询:

select *
from table1 t1
where exists (select 1 from table2 t2 where t2.columnA = t1.col1 and t2.keyColumn = 3) or
      exists (select 1 from table2 t2 where t2.columnA = t2.col1 and t2.keyColumn = 3);

在这种情况下,适当的索引是table2(columnA, keyColumn)

答案 1 :(得分:2)

尝试

select distinct t1.* from table1 t1 
inner join table2 t2 ON t1.col1 =t2.columnA OR t1.col2 = t2.columnA

答案 2 :(得分:1)

假设您在VFP中执行此操作,请使用SYS(3054)查看查询是如何优化的以及哪些部分不是。

答案 3 :(得分:0)

主查询和子查询是否完全可以Rushmore优化?

由于子查询似乎没有相关性(即它们不引用table1,只要索引完全支持所有内容,你应该没问题。