我遇到了问题。我有一个查询
Select * from tabA
where (a) in (a,b,c)
OR b in (a,b,c)
由于此查询,我想面对性能问题,因为我需要删除或条件,所以我尝试使用以下查询:
Select * from tabA
where (a,b) in (a,b,c)
但是此查询似乎不起作用,请帮忙。我不想使用'或'条件。
答案 0 :(得分:4)
如果您在逻辑上需要OR条件,那么这就是您所需要的。使用OR没有任何问题。如果两个列都已编制索引,则查询可能不会再独立运行这两个查询:
select * from tabA
where a in (a,b,c);
select * from tabA
where b in (a,b,c);
优化器可能会这样做,并将结果连接起来:
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=2 Bytes=256)
1 0 CONCATENATION
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'TABA' (Cost=2 Card=1 Bytes=128)
3 2 INDEX (RANGE SCAN) OF 'TABA_A_IDX' (NON-UNIQUE) (Cost=1 Card=1)
4 1 TABLE ACCESS (BY INDEX ROWID) OF 'TABA' (Cost=2 Card=1 Bytes=128)
5 4 INDEX (UNIQUE SCAN) OF 'TABA_B_IDX' (NON-UNIQUE) (Cost=1 Card=1)
答案 1 :(得分:3)
如果逻辑保持不变 - 您可以尝试使用UNION
Select * from tabA
where (a) in (a,b,c)
union
Select * from tabA
where b in (a,b,c)
另外,检查您的索引并解释计划结果 - 索引可以解决原始OR问题。
答案 2 :(得分:2)
你使用了错误的语法,如果你想要对比较值你应该使用smth:
select * from tabA
where (a,b) in ((a,b), (a,c), (b,c) etc.
无论如何in
条件在查询执行期间转换为多个or
条件。
如果您显示表格结构和执行计划,人们将能够更有效地帮助您。