今天遇到一个外链接加上过滤条件导致外链接失效(也就是没有起作用
),虽然是个小问题,但是自己之前真的没有在意,今天记一下顺便温习一下oracle表连接:
SQL> select * from t1;
A B
---------- ----------
1 101
2 102
3 103
4 104
5 105
6 106
7 107
8 108
9 109
SQL> select * from t2;
C D
---------- ----------
1001
2 1002
1003
4 1004
1005
6 1006
1007
8 1008
1009
SQL> select a,b,c,d from t1,t2 where t1.a=t2.c(+); ---不加过滤条件,会得到下面的结果集
A B C D
---------- ---------- ---------- ----------
2 102 2 1002
4 104 4 1004
6 106 6 1006
8 108 8 1008
5 105
3 103
1 101
7 107
9 109
SQL> select a,b,c,d from t1,t2 where t1.a=t2.c(+) and t2.d>1001; --但是加了过滤调价t2.d>1001后发现直接外链接就没作用了
A B C D
---------- ---------- ---------- ----------
2 102 2 1002
4 104 4 1004
6 106 6 1006
8 108 8 1008
SQL> select a,b,c,d from t1,t2 where t1.a=t2.c(+) and t2.d(+)>1001; ---改成t2.d(+)>1001,查询又会继续走外链接
A B C D
---------- ---------- ---------- ----------
2 102 2 1002
4 104 4 1004
6 106 6 1006
8 108 8 1008
5 105
3 103
1 101
7 107
9 109
结论: 当表连接使用外连接时,如果where字句包含多个条件,必须在所有条件中都增加(+)操作符,否则外链接很有可能直接不起作用的,
谨以此记录一下
SQL> select * from t1;
A B
---------- ----------
1 101
2 102
3 103
4 104
5 105
6 106
7 107
8 108
9 109
SQL> select * from t2;
C D
---------- ----------
1001
2 1002
1003
4 1004
1005
6 1006
1007
8 1008
1009
SQL> select a,b,c,d from t1,t2 where t1.a=t2.c(+); ---不加过滤条件,会得到下面的结果集
A B C D
---------- ---------- ---------- ----------
2 102 2 1002
4 104 4 1004
6 106 6 1006
8 108 8 1008
5 105
3 103
1 101
7 107
9 109
A B C D
---------- ---------- ---------- ----------
2 102 2 1002
4 104 4 1004
6 106 6 1006
8 108 8 1008
SQL> select a,b,c,d from t1,t2 where t1.a=t2.c(+) and t2.d(+)>1001; ---改成t2.d(+)>1001,查询又会继续走外链接
A B C D
---------- ---------- ---------- ----------
2 102 2 1002
4 104 4 1004
6 106 6 1006
8 108 8 1008
5 105
3 103
1 101
7 107
9 109
结论: 当表连接使用外连接时,如果where字句包含多个条件,必须在所有条件中都增加(+)操作符,否则外链接很有可能直接不起作用的,
谨以此记录一下
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28473562/viewspace-1819942/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28473562/viewspace-1819942/