场景:数据库中两个表 表1 表2
1 . 其中表2是表1的一个附属表;
2 . 两个表中各有一个生成时间,表1中时间不变,表2中修改用户信息时会变;
3 . 查询sysdate-表1中时间>30且sysdate-表2中时间>30的用户会员号;
语句1:
SELECT A.会员号
FROM
(SELECT t.*FROM 表1 twhere SYSDATE - TO_DATE(表1.时间,'yyyyMMddHH24MISS') >30) A,
(SELECT t2.会员号 表1 t2,表2 t1 WHERE 表1.会员号=表2.会员号AND SYSDATE -表1.时间>30 AND SYSDATE -表2.时间<30) C
WHERE
A.会员号 <> C.会员号;
若A中语句过滤出了10条数据,C中过滤出2条数据,不看结果,分析应该是得到8条结果;
实际上得到18条数据,DISTINCT 后发现是10条数据,分析是临时表A与临时表C做过滤时对比了两遍,一次少一条<>的数据,查询得到的结果为A的数据条数X C的数据条数-C的数据条数;
修正后语句:
SELECT A.会员号
FROM
(SELECT t.*FROM 表1 twhere SYSDATE - TO_DATE(表1.时间,'yyyyMMddHH24MISS') >30) A
WHERE A.会员号NOT IN
(SELECT t2.会员号 表1 t2,表2 t1 WHERE 表1.会员号=表2.会员号AND SYSDATE -表1.时间>30 AND SYSDATE -表2.时间<30);
由上得出<>号只适用于单个数据;
注:<> 与 NOT IN 会过滤null;
上面是根据我当时的需求写的sql,不容易理解,下面是我单独的演示:
SQL> select * from test1;
NO NAME SEX AGE DEPARTMENT LOCATION
---------- ---------- ---------- ------------ ---------------------------------------- ----------------------------------------
null null null 0 null 0
2018001 张三 男 20 计算机系 北京
2018002 李四 男 20 计算机系 上海
2018003 王五 男 21 计算机系 广东
2018004 小红 女 21 计算机系 北京
2018005 小李 女 20 软件工程 上海
2018006 小王 女 22 软件工程 广东
null null 0 null 0
已选择8行。
SQL>
SQL> select * from test1 t1 where no not in ('2018001','2018002') ;
过滤掉了null的情况;
SQL> select * from test1 t1 where no not in ('2018001','2018002') ;
NO NAME SEX AGE DEPARTMENT LOCATION
---------- ---------- ---------- ------------ ---------------------------------------- ----------------------------------------
null null null 0 null 0
2018003 王五 男 21 计算机系 广东
2018004 小红 女 21 计算机系 北京
2018005 小李 女 20 软件工程 上海
2018006 小王 女 22 软件工程 广东
SQL>
SQL> select * from test1 t1 where no <> '2018002' ;
过滤掉了null的情况;<>后面值存在多个查询结果会产生笛卡儿积现象
SQL> select * from test1 t1 where no <> '2018002' ;
NO NAME SEX AGE DEPARTMENT LOCATION
---------- ---------- ---------- ------------ ---------------------------------------- ----------------------------------------
null null null 0 null 0
2018001 张三 男 20 计算机系 北京
2018003 王五 男 21 计算机系 广东
2018004 小红 女 21 计算机系 北京
2018005 小李 女 20 软件工程 上海
2018006 小王 女 22 软件工程 广东
已选择6行。
SQL>
希望对你有帮助,祝你有一个好心情,加油!
若有错误、不全、可优化的点,欢迎纠正与补充!