Oracle各種連接介紹SQL> select * from a1;BBB----------101102103104105SQL> select * from a2;BBB CCC---------- --------------------101102105SQL> select * from a1,a2 where a1.bbb(+)=a2.bbb; 右連接BBB BBB CCC---------- ---------- --------------------101 101102 102105 105SQL> select * from a1,a2 where a1.bbb=a2.bbb(+); 左連接BBB BBB CCC---------- ---------- --------------------101 101102 102103104105 105再一個例子a:id name6 D1 A2 B3 Cb:id name1 102 203 305 40右連接:SQL> select a.id,a.name,b.id,b.name from a, b WHERE a.id(+) = b.id;ID NAME ID NAME--- ------------------------------ --- --------------------1 A 1 102 B 2 203 C 3 30 5 40左連接SQL> select a.id,a.name,b.id,b.name from a, b WHERE a.id = b.id(+);ID NAME ID NAME--- ------------------------------ --- --------------------1 A 1 102 B 2 203 C 3 306 D 右連接說明等號右側的所有記錄均會被顯示,無論其在左側是否得到匹配,左連接與之相反a(+)=b:右連接“(+)”所在位置的另一側為連接的方向,右連接說明等號右側的所有記錄均會被顯示,無論其在左側是否得到匹配。a=b(+):左連接內連接SQL> select * from a inner join b on a.id=b.id;ID NAME QQQ ID NAME--- ------------------------------ --- --- --------------------1 A 1 1 102 B 1 2 203 C 1 3 30相當于select a.*,b.* from a,b where a.id=b.id外連接SQL> select * from a left join b on a.id=b.id;ID NAME QQQ ID NAME--- ------------------------------ --- --- --------------------1 A 1 1 102 B 1 2 203 C 1 3 306 D 1 內外連接只有在9i以后才能使用補充外部聯接 "+" 按其在 "=" 的左邊或右邊分左聯接和右聯接 . 若不帶 "+" 運算符的表中的一個行不直接匹配于帶 "+" 預算符的表中的任何行 , 則前者的行與后者中的一個空行相匹配并被返回 . 若二者均不帶 '+', 則二者中無法匹配的均被返回 . 利用外部聯接 "+", 可以替代效率十分低下的 not in 運算 , 大大提高運行速度 . 例如 , 下面這條命令執行起來很慢 select a.empno from emp a where a.empno not in (select empno from emp1 where job='SALE'); ---- 倘若利用外部聯接 , 改寫命令如下 : select a.empno from emp a ,emp1 b where a.empno=b.empno(+) and b.empno is null and b.job='SALE';
===================================================================
select * from a, b where a.id = b.id; 對于外連接,Oracle中可以使用“(+)”來表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN,下面將配合實例一一介紹。 1. LEFT OUTER JOIN:左外關聯SELECT e.last_name, e.department_id, d.department_name FROM employees e LEFT OUTER JOIN departments d ON (e.department_id = d.department_id); 等價于 SELECT e.last_name, e.department_id, d.department_name FROM employees e, departments d WHERE e.department_id=d.department_id(+); 結果為:所有員工及對應部門的記錄,包括沒有對應部門編號department_id的員工記錄。 2. RIGHT OUTER JOIN:右外關聯 SELECT e.last_name, e.department_id, d.department_name FROM employees e RIGHT OUTER JOIN departments d ON (e.department_id = d.department_id); 等價于 SELECT e.last_name, e.department_id, d.department_name FROM employees e, departments d WHERE e.department_id(+)=d.department_id; 結果為:所有員工及對應部門的記錄,包括沒有任何員工的部門記錄。 3. FULL OUTER JOIN:全外關聯 SELECT e.last_name, e.department_id, d.department_name FROM employees e FULL OUTER JOIN departments d ON (e.department_id = d.department_id); 結果為:所有員工及對應部門的記錄,包括沒有對應部門編號department_id的員工記錄和沒有任何員工的部門記錄。
新聞熱點
疑難解答