换了新工作之后,接触的都是PL/SQL的东西,之前也没有太注意左外连接,右外连接什么的.
先说说问题吧,我现在是在搞数据的,搞数据最怕的就是数据的丢失,但是多表关联,多条件之后最容易数据丢失,自己水平又有限,每次多表关联之后,到要去查查原表跟最后生成的表,数据rownum是不是一样的.有时候自己写的PL/SQL,自己都没底.
1.首先说说2表之间的左右连接吧.
zc_table1
zc_table2
SELECT * FROM zc_table1 a,zc_table2 b WHERE a.id = b.id(+);左外连接,显示左表所有的数据以及右表ID匹配的数据
右外连接也是同样的道理.这里就不说明了.
2. 三表之间的外连接
zc_table3
1) SELECT * FROM ZC_TABLE1 A,ZC_TABLE2 B,ZC_TABLE3 C WHERE A.ID = B.ID(+) AND B.ID = C.ID(+);
这种情况很明显A表的数据会全部显示.A左外连接B,B左外连接C.
2) SELECT * FROM ZC_TABLE1 A,ZC_TABLE2 B,ZC_TABLE3 C WHERE A.ID = B.ID(+) AND B.ID = C.ID;
这里少了个(+), 左外连接失效,等同于SELECT * FROM ZC_TABLE1 A,ZC_TABLE2 B,ZC_TABLE3 C WHERE A.ID = B.ID AND B.ID = C.ID;
3)SELECT * FROM ZC_TABLE1 A,ZC_TABLE2 B,ZC_TABLE3 C WHERE A.ID = B.ID(+) AND A.ID = C.ID(+);
A左外连接B,A左外连接C. 此时多了C中的一条数据相比于 1).
4) SELECT * FROM ZC_TABLE1 A,ZC_TABLE2 B,ZC_TABLE3 C WHERE A.ID = B.ID(+) AND C.ID = B.ID(+);
这样的sql 是错误的左外连接.