oracle中外关联的解惑(四)
| 5 | 105 | 3 (0)| 00:00:01 |
20
| 3 | TABLE ACCESS FULL| P1 | 8 | 168 | 2 (0)| 00:00:01 |
21
---------------------------------------------------------------------------
22
23
Predicate Information (identified by operation id):
24
---------------------------------------------------
25
26
1 - access("P1"."B"="P3"."B3" AND "P1"."A"="P3"."A3")
结果变成了普通关联,因为如果添加空行,后面普通关联的条件一定不成立,null不等于任何值。而且where的关联条件不能再使用"+"做外关联,两种书写方式不能同时使用。
结论:where条件的所有过滤可以认为是外关联后的过滤,如果有关联条件则会降级为普通关联。
三、"+"形式的外关联:
1、简单关外关联。
01
SQL> select * from p1,p3 where a=a3(+);
02
03
A B C A3 B3 C3
04
----- ----- ----- ----- ----- -----
05
1 1 1 1 1 1
06
2 2 2 2 2 2
07
3 3 3 3 3 3
08
4 s d 4
09
5 f f 5 d d
10
6 s
11
7 d
12
8 d
13
14
已选择8行。
15
16
17
执行计划
18
----------------------------------------------------------
19 www.2cto.com
Plan hash value: 3306833788
20
21
---------------------------------------------------------------------------
22
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
23
---------------------------------------------------------------------------
24
| 0 | SELECT STATEMENT | | 8 | 336 | 6 (17)| 00:00:01 |
25
|* 1 | HASH JOIN OUTER | | 8 | 336 | 6 (17)| 00:00:01 |
26
| 2 | TABLE ACCESS FULL| P1 | 8 | 168 | 2 (0)| 00:00:01 |
27
| 3 | TABLE ACCESS FULL| P3 | 5 | 105 | 3 (0)| 00:00:01 |
28
---------------------------------------------------------------------------
29
30
Predicate Information (identified by operation id):
31
---------------------------------------------------
32
33
1 - access("A"="A3"(+))
2、主表过滤条件。
01 www.2cto.com
SQL> select * from p1,p3 where a=a3(+) and b='s';
02
03
A B C A3 B3 C3
04
----- ----- ----- ----- ----- -----
05
4 s d 4
06
6 s
07
08
09
执行计划
10
----------------------------------------------------------
11
Plan hash value: 3306833788
12
13
---------------------------------------------------------------------------
14
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
15
---------------------------------------------------------------------------
16
| 0 | SELECT STATEMENT | | 2 | 84 | 6 (17)| 00:00:01 |
17
|* 1 | HASH JOIN OUTER | | 2 | 84 | 6 (17)| 00:00:01 |
18
|* 2 | TABLE ACCESS FULL| P1 | 2 | 42 | 2 (0)| 00:00:01 |
19
| 3 | TABLE ACCESS FULL| P3 | 5 | 105 | 3 (0)| 00:00:01 |
20
---------------------------------------------------------------------------
21
22
Predicate Information (identified by operation id):
23 www.2cto.com
---------------------------------------------------
24
25
1 - access("A"="A3"(+))
26
2 - filter("B"='s')
和left join在where条件中加主表过滤结果一样。
3、子表加过滤条件。
01
SQL> select * from p1,p3 where a=a3(+) and b3 is null;
02
03
A B C A3 B3 C3
04
----- ----- ----- ----- ----- -----
05
4 s d 4
06
6 s
07
7 d
08
8