ORACLE数据库SQL优化---)Oracle表连接类型(二)

2014-11-24 16:55:49 · 作者: · 浏览: 1
包含目标表T1和目标表T2中所有满足条件的记录外,还包含了目标表T2和目标表T2中所有不满足该连接条件的记录,同时所有不满足条件的以NULL填充。

3,除了带连接条件,还带上其他限制条件

上面的例子都是除了连接条件,没有带其他的限制条件,如果目标SQL中除了表连接条件之外还带有其他的限制条件,则目标SQL中表连接烈性和该额外限制条件在目标SQL中的SQL文本中出现的位置都可能会对最终执行结果产生影响。

看如下的例子:

SQL例子1

SQL> select t1.col1,t1.col2,t2.col3 from t1 join t2 on (t1.col2=t2.col2 and t1.col1=1);

COL1 COL2 COL3
---------- ---------- ----------
1 A A2

SQL例子2

SQL> select t1.col1,t1.col2,t2.col3 from t1 join t2 on (t1.col2=t2.col2) where t1.col1=1;

COL1 COL2 COL3
---------- ---------- ----------
1 A A2

从上面例子1和例子2可以看出除了表连接条件”t1.col2=t2.col2 ”之外,还多了一个额外的限制条件"t1.col1=1",对于该限制条件,一个在join on所对应的括号内,而一个在JOIN ON 所对应的括号外,虽然该限制条件在SQL文本中所处的位置不同,但因为都是内连接,所以该限制条件的位置并不会影响实际的表的连接结果。

下面在看一下外连接有额外限制条件的SQL语句:

SQL例子3

SQL> select t1.col1,t1.col2,t2.col3 from t1 left join t2 on (t1.col2=t2.col2 and t1.col1=1);

COL1 COL2 COL3
---------- ---------- ----------
1 A A2
2 B
3 C

SQL例子4

SQL> select t1.col1,t1.col2,t2.col3 from t1 left join t2 on (t1.col2=t2.col2) where t1.col1=1;

COL1 COL2 COL3
---------- ---------- ----------
1 A A2

由于此时是外连接,从上面的SQL例子3和SQL例子4可以看出此时的结果是不一样的了。具体来说是这样的:对于该限制条件(t1.col1=1),它在例子3的SQL文本位于left join所对应的括号内,这表示该限制条件会在表T1和表T2做左连接之前就被应用在T1上。而在例子4中,限制条件(t1.col1=1)是在左连接的所对应的括号外,这表示该限制条件在表T1和表T2做完左连接后,才会被应用在表T1和表T2的连接结果集上,

从上面的结果我们可以得出如下的结论:对于外连接而言,除了表连接条件之外的额外的限制条件在目标SQL的SQL文本中的所处的位置确实可能会影响该SQL的实际执行

结果。

对于ORACLE用自定义的关键字”(+)“来表示外连接。关键字“(+)”的位置在目标SQL连接条件中某一个表的连接列的后面,其含义是关键字“(+)”出现在那个表的连接列后面,就表明哪个表会以NULL来填充那些不满足连接条件并位于该表中的查询列,此时应该以关键字“(+)”对面的表来作为外连接的驱动表,这里的关键是决定哪个表是驱动表。看如下的ORACLE的写法的例子:

t2是驱动表

SQL> select t1.col1,t1.col2,t2.col3 from t1,t2 where t1.col2(+)=t2.col2;

COL1 COL2 COL3
---------- ---------- ----------
1 A A2
2 B B2
D2

t1是驱动表

SQL> select t1.col1,t1.col2,t2.col3 from t1,t2 where t1.col2=t2.col2(+);

COL1 COL2 COL3
---------- ---------- ----------
1 A A2
2 B B2
3 C

下面两种写法(例子5和例子6)是一致的:

SQL例子5

SQL> select t1.col1,t1.col2,t2.col3 from t1,t2 where t1.col2=t2.col2(+) and t1.col1=1;

COL1 COL2 COL3
---------- ---------- ----------
1 A A2

SQL例子6

SQL> select t1.col1,t1.col2,t2.col3 from t1 left join t2 on (t1.col2=t2.col2) where t1.col1=1;

COL1 COL2 COL3
---------- ---------- ----------
1 A A2