select djh from jlczkj.tdqs_zd where djh in (select djh from tddj_qsdc where lifecycle='0' )可以执行select djh from jlczkj.tdqs_zd where djh not in (select djh from tddj_qsdc where lifecycle='0' )却一直是正在执行
数据量大时最好使用exists 1、select a.djh from jlczkj.tdqs_zd a where exists (select 1 from tddj_qsdc b where b.lifecycle='0' and b.djh =a.djh ) 2、select a.djh from jlczkj.tdqs_zd a where not exists (select 1 from tddj_qsdc b where b.lifecycle='0' and b.djh =a.djh )
表的数据很大的时候,最好别使用 not in ,最好用not exists来代替
in可以分为三类: 1、形如select * from t1 where f1 in ('a','b'),应该和select * from t1 where f1 ='a' or f1='b' 或者 select * from t1 where f1 ='a' union all select * from t1 f1='b'比较效率 2、形如select * from t1 where f1 in (select f1 from t2 where t2.fx='x'),其中子查询的where 里的条件不受外层查询的影响,这类查询一般情况下,自动优化会转成exist语句,也就是效率和exist一样。 3、形如select * from t1 where f1 in (select f1 from t2 where t2.fx=t1.fx),其中子查询的where 里的条件受外层查询的影响,这类查询的效率要看相关条件涉及的字段的索引情况和数据量多少,一般认为效率不如exists。 除了第一类in语句都是可以转化成exists 语句的,一般编程习惯应该是用exists而不用in.
速率要快很多
1、select a.djh from jlczkj.tdqs_zd a where exists (select 1 from tddj_qsdc b where b.lifecycle='0' and b.djh =a.djh ) 2、select a.djh from jlczkj.tdqs_zd a where not exists (select 1 from tddj_qsdc b where b.lifecycle='0' and b.djh =a.djh )
1、形如select * from t1 where f1 in ('a','b'),应该和select * from t1 where f1 ='a' or f1='b' 或者 select * from t1 where f1 ='a' union all select * from t1 f1='b'比较效率
2、形如select * from t1 where f1 in (select f1 from t2 where t2.fx='x'),其中子查询的where 里的条件不受外层查询的影响,这类查询一般情况下,自动优化会转成exist语句,也就是效率和exist一样。
3、形如select * from t1 where f1 in (select f1 from t2 where t2.fx=t1.fx),其中子查询的where 里的条件受外层查询的影响,这类查询的效率要看相关条件涉及的字段的索引情况和数据量多少,一般认为效率不如exists。 除了第一类in语句都是可以转化成exists 语句的,一般编程习惯应该是用exists而不用in.