利用外连接替代not in语句
% N/ ^9 i' A) H! d X- E; N6 w- O in语句还有not in语句的效率是非常的差的,因为数据库在遇到这两种语句的时候是要把数据进行一条一条的比对,如果in或者not in两侧的数据量在上万条的时候,进行比对的次数就是上亿次,很可能一个简单的sql语句就要执行半个小时以上。这种效率客户是肯定不能够接受的。那我们可以考虑两种方法进行替代,第一种就是采用exist语句和not exist语句,这种大家应该比较熟悉了。另外一种就是巧用外关联语句,这种方法可能大家不是很熟悉,我来稍微说一下。假设数据表的建表DDL语句为* T. J( z) D. ?/ k3 L; X$ _! ^
CREATE TABLE T1(ID VARCHAR2(4) PRIMARY KEY, VALUE INT)0 |3 T, x) A4 A1 g0 u
而in或者not in的表的建表DDL语句为* S8 l( H a! A
CREATE TABLE T2(VALUE INT)
4 W& N4 h x! H' C Oracle中外关联采用的是(+)符号表示外关联,也就是说标识了(+)符号的部分在找不到对应的值的时候为NULL。下面是替代in语句的时候的SQL语句
" z! E! q* Y) a3 \以下是引用片段:
7 E2 Q. g4 c* k- M SELECT T1.ID, T1.VALUE
0 G3 @) c4 B- n FROM T1, T2 % a' o, H x; U- K8 A& ]% I
WHERE T1.VALUE = T2.VALUE(+)
% C1 V' [7 ~. S( A$ H6 ^5 J AND T2.VALUE IS NOT NULL; & m; `" X* f2 P; ^: D, c
4 U( k9 L5 S: U' Q% K- P
而类似的。替代not in语句的时候的SQL语句则为
% f! r6 d* l. M9 T8 Z9 }8 O以下是引用片段:
$ ~- ^/ T& E" J) V* |8 `& Z SELECT T1.ID, T1.VALUE 1 q X6 o: n$ I$ T
FROM T1, T2 ! l& m. t0 l8 N4 A
WHERE T1.VALUE = T2.VALUE(+)
5 }) I4 }5 f$ q( M AND T2.VALUE IS NULL; |