OT IN:
select *
from rateparam1.Work_Order_Def a
where workorder_id not in
(select b.workorder_id from rateparam1.work_order_process_log b);
OUTER JOINS:
select * from rateparam1.Work_Order_Def a,rateparam1.work_order_process_log b
where a.workorder_id = b.workorder_id(+)
and b.workorder_id is null;
NOT EXISTS:
select *
from rateparam1.Work_Order_Def a
where not exists (select *
from rateparam1.work_order_process_log b
where a.workorder_id = b.workorder_id)
A表大于B表,查找A>B的部分(A中存在,B中不存在)。
select * from A
where not exists (select * from B
where A.** = B.**
and ...)---B表=A表的部分
NOT IN < OUTER JOIN < NOT EXISTS
在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。
通过使用EXIST,Oracle系 统会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle系统在执行IN子查询时,首先执行子查询,并将获得的结果列表 存放在在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS 比使用IN通常查询速度快的原因。
同时应尽可能使用NOT EXISTS来代替NOT IN,尽管二者都使用了NOT(不能使用索引而降低速度),NOT EXISTS要比NOT IN查询效率更高。