|
create table temp_test1
(
a number(10) );
INSERT INTO temp_test1 VALUES(1);
INSERT INTO temp_test1 VALUES(2);
INSERT INTO temp_test1 VALUES(3);
INSERT INTO temp_test1 VALUES(4);
COMMIT;
create table temp_test2
(
b number(10), c varchar2(2) );
INSERT INTO temp_test2 VALUES(1, 'a');
INSERT INTO temp_test2 VALUES(2, 'a');
INSERT INTO temp_test2 VALUES(3, 'a');
INSERT INTO temp_test2 VALUES(5, 'b');
COMMIT;
|
|
--最初想得到的结果
SELECT a, b, c
FROM temp_test1 LEFT OUTER JOIN temp_test2 ON temp_test1.a=temp_test2.b; |
|
|
A
|
B
|
C
|
|
1
|
1
|
1
|
a
|
|
2
|
2
|
2
|
a
|
|
3
|
3
|
3
|
a
|
|
4
|
4
|
|
--在temp_test2加一个条件(先连接,后过滤,结果少了一列)
SELECT a, b, c
FROM temp_test1 LEFT OUTER JOIN temp_test2 ON temp_test1.a=temp_test2.b WHERE c='a';
|
|
|
A
|
B
|
C
|
|
1
|
1
|
1
|
a
|
|
2
|
2
|
2
|
a
|
|
3
|
3
|
3
|
a
|
|
--在temp_test2加一个条件,换一种写法(似乎是过滤了再连接)
SELECT a, b, c
FROM temp_test1 LEFT OUTER JOIN temp_test2 ON temp_test1.a=temp_test2.b AND temp_test2.C='a';
|
|
SELECT a, b, c
FROM temp_test1 LEFT OUTER JOIN temp_test2 ON temp_test2.C='a' AND temp_test1.a=temp_test2.b;
|
|
--用另一种语法进行左连接
SELECT a,b,c
FROM temp_test1, temp_test2
WHERE temp_test1.a=temp_test2.b(+)
|
|
--用另一种语法进行左连接,加上过滤条件,发现是连接后再过滤
SELECT a,b,c
FROM temp_test1, temp_test2
WHERE temp_test1.a=temp_test2.b(+) AND temp_test2.C='a'; |
|
--用另一种语法进行左连接,修改条件的顺序,发现还是连接后再过滤
SELECT a,b,c
FROM temp_test1, temp_test2
WHERE temp_test2.C='a' AND temp_test1.a=temp_test2.b(+); |
1、 对于SQL92语法的左外连接(left outer join),WHERE的过滤条件是连接后再过滤的;
2、 对于SQL92语法的左外连接(left outer join),把过滤条件写在FROM部分和写在WHERE部分效果是不同的;(为什么不同,到底有些什么不同不得而知,只能猜测)
3、 对于SQL89语法的左外连接( =(+) ),都是连接后再过滤的。
|
--强制性地过滤后再连接
WITH
result1 AS
(
SELECT b, c FROM temp_test2 WHERE c='a' )
SELECT a,b,c
FROM temp_test1 LEFT OUTER JOIN result1 ON temp_test1.a=result1.b; |
本文通过实例探讨了Oracle数据库中左外连接(left outer join)的不同写法及其对查询结果的影响,对比了SQL92和SQL89语法的区别,并提供了一种更安全的写法。

被折叠的 条评论
为什么被折叠?



