对于not in来说
如果select empno from emp1 where job='SALE'结果集很大
每从emp查询一条记录,都会在这个无索引的结果集里面全部扫描一次这种乘积似的扫描,很夸张的在这样的情况下表连接方式稍微好一些但事实上,在一些极端情况下,到底哪个语句快,只能根据具体环境测量btw:
select a.empno from emp a ,emp1 b where a.empno=b.empno(+) and b.empno is null and b.job='SALE';and b.job='SALE' 这个条件没有任何意义
如果select empno from emp1 where job='SALE'结果集很大
每从emp查询一条记录,都会在这个无索引的结果集里面全部扫描一次这种乘积似的扫描,很夸张的在这样的情况下表连接方式稍微好一些但事实上,在一些极端情况下,到底哪个语句快,只能根据具体环境测量btw:
select a.empno from emp a ,emp1 b where a.empno=b.empno(+) and b.empno is null and b.job='SALE';and b.job='SALE' 这个条件没有任何意义
这条语句的意思就是,将表中col1,col2,clo3……相同的最大的rowid取出来,将小于它的rowid对应的纪录删掉那么将保留rowid最大的一条纪录
这条语句的意思就是,将表中col1,col2,clo3……相同的最大的rowid取出来,将小于它的rowid对应的纪录删掉那么将保留rowid最大的一条纪录
但是删除时还得留一条记录,上面这个语句就是说,在子查询里查出重复记录的最大ROWID,然后将所有小于该ROWID的记录全部删除,注意这时不能用‘<=’。
这样就达到了删除重复记录的目的。
2、用NOT IN时原理是对A表中的每一条记录,SQL都要到emp1中查找是否存在。
而用两表联合查询时,SQL首先把数据连接起来,再由查询条件来选择需要的数据,肯定要快哦。
但是删除时还得留一条记录,上面这个语句就是说,在子查询里查出重复记录的最大ROWID,然后将所有小于该ROWID的记录全部删除,注意这时不能用‘<=’。
这样就达到了删除重复记录的目的。
2、用NOT IN时原理是对A表中的每一条记录,SQL都要到emp1中查找是否存在。
而用两表联合查询时,SQL首先把数据连接起来,再由查询条件来选择需要的数据,肯定要快哦。
-
1
2
3
4
5 SQL> select * from emp1;E JOB
- ----------
1 sale
2 sale
4 clerk
5 manager 1* select a.empno from emp a where a.empno not in (select empno from emp1 where job = 'sale')
SQL> /E
-
3
4
5 ----NOT IN 查询出的数据
SQL> select a.empno from emp a,emp1 b where a.empno = b.empno(+) and b.empno is null and b.job ='sale';未选定行-----可以看出该语句绝对是错的。
SQL> 1* select a.empno from emp a,emp1 b where a.empno = b.empno(+) and (b.empno is null or b.job <>'sale')
SQL> /E
-
3
4
5 ---这种语句可行。
SQL> 1* select a.empno from emp a,emp1 b where a.empno = b.empno(+) and nvl(b.job,'@@@') <>'sale'
SQL> /E
-
3
4
5
--这种语句也可行。
SQL> hope this can help u
可以改写为
select a.empno from emp a where not exists(select 1 from emp1 where emp1.job='SALE' and emp1.empno = a.empno);或者写成
select a.empno from emp a
minus
select empno from emp1 where job='SALE';