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; |