我有一张桌子。我必须查询一个sql,如:
select * from user1 where user1.id in(1,11,111)
“1,11,111”是会话中已知的值。
现在我想替换in
以提升效果,但exists
无法做到。
如果你知道怎么做,请告诉我。谢谢!
答案 0 :(得分:2)
您可以使用OR
SELECT *
FROM user1
WHERE user1.id = 1
OR user1.id = 11
OR user1.id = 111
答案 1 :(得分:1)
我认为IN
运算符很好,完全符合它的意思。 优化程序会在内部将查询转换为OR
条件。为简单起见,要解析的代码较少,IN将缩短查询并易于编写而不是多个OR语句。
解释计划将清楚地显示应用的过滤器转换为IN子句的多个OR。
例如,
SQL> EXPLAIN PLAN FOR SELECT * FROM emp WHERE deptno IN(10,20,30);
Explained.
SQL>
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 13 | 481 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| EMP | 13 | 481 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------
1 - filter("DEPTNO"=10 OR "DEPTNO"=20 OR "DEPTNO"=30)
13 rows selected.
因此,正如您所看到的,WHERE deptno IN(10,20,30)
被优化程序解释为"DEPTNO"=10 OR "DEPTNO"=20 OR "DEPTNO"=30