通過使用exists,oracle會首先檢查主查詢,然後執行子查詢直到它找到第乙個匹配項,這就節省了時間。oracle在執行in子查詢時,首先執行子查詢,並將獲得的結果列表存放在乙個加了索引的臨時表中。在執行子查詢之前,系統先將主查詢掛起,待子查詢執行完畢,存放在臨時表中以後再執行主查詢。這也就是使用exists比使用in通常查詢速度快的原因
exists 與in 的互換
update p_container_decl cd
set cd.annul_flag=\'0001\',annul_date = sysdate
where exists(
select 1
from (
select tc.decl_no,tc.goods_no
from p_transfer_cont tc,p_affirm_do ad
where tc.goods_decl_no = ad.decl_no
and ad.decl_no = \'sssssssssssssssss\'
) awhere a.decl_no = cd.decl_no
and a.goods_no = cd.goods_no
)update p_container_decl cd
set cd.annul_flag=\'0001\',annul_date = sysdate
where (decl_no,goods_no) in
(select tc.decl_no,tc.goods_no
from p_transfer_cont tc,p_affirm_do ad
where tc.goods_decl_no = ad.decl_no
and ad.decl_no = 『ssssssssssss』
)
例如:表a(小表),表b(大表)
1:效率低,用到了a表上cc列的索引;
select * from a where cc in (select cc from b)
效率高,用到了b表上cc列的索引。
select * from a where exists(select cc from b where cc=a.cc)
如果轉換下:表a(大表),表b(小表)
還是上面的sql ,in 的效率要比 exists 高
Sql EXISTS 用於子查詢
exists用於檢查子查詢是否至少會返回一行資料,該子查詢實際上並不返回任何資料,而是返回值true或false。exists 指定乙個子查詢,檢測行的存在。語法 exists subquery。引數 subquery 是乙個受限的 select 語句 不允許有 compute 子句和 into 關...
SQL EXISTS學習筆記
sql exists學習筆記 最初遇到exists這個函式,是在建表語句裡面。drop table if exists 下午工作的時候,需要完成 假如資料已經存在資料庫的時候,執行更新語句 假如資料不存在,執行插入語句 假如通過儲存過程來完成的話,配合if else語句,可以實現。大概思路如下 1....
sql exists和in的區別
1.in或not in 裡面不能有null,否則會得不到結果 exists在子查詢中使用null仍返回結果集。2.exists 子查詢是乙個受限的select語句 不允許有compute和into 結果型別為boolean 若子查詢包含行,則返回true in確定給定的值是否與子查詢或列表中的值相匹...