ORACLE 8i,9i 表连接方法
partnerDragon
|
1#
partnerDragon 发表于 2007-03-11 01:00
ORACLE 8i,9i 表连接方法
一般的相等连接:
select * from a, b where a.id = b.id; 这个就属于内连接。 对于外连接: Oracle中可以使用“(+) ”来表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN 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的员工记录。 SELECT * FROM LIUJUN; AA BB AA BB -------------------- ---------------------- -------------------- ---------------------- B 10 B 2 B 10 B 2 2 rows selected SELECT * FROM LIUJUN2; AA BB AA BB -------------------- ---------------------- -------------------- ---------------------- A 1 B 10 B 2 B 10 B 2 SELECT * FROM LIUJUN A,LIUJUN2 B WHERE A.AA(+)=B.AA; 上边的左外连接是以B表为准,即使B.AA字段的值在A.AA中找不到匹配,也把B中的记录显示出来; 右边的记录为3条,所以结果为: AA BB AA BB -------------------- ---------------------- -------------------- ---------------------- A 1 B 10 B 2 B 10 B 2 3 rows selected SELECT * FROM LIUJUN A,LIUJUN2 B WHERE A.AA=B.AA(+); 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 结果为:所有员工及对应部门的记录,包括没有任何员工的部门记录。 SELECT * FROM LIUJUN; AA BB AA BB -------------------- ---------------------- -------------------- ---------------------- B 10 B 2 B 10 B 2 2 rows selected SELECT * FROM LIUJUN2; AA BB AA BB -------------------- ---------------------- -------------------- ---------------------- A 1 B 10 B 2 B 10 B 2 SELECT * FROM LIUJUN A,LIUJUN2 B WHERE A.AA=B.AA(+); 上面的右外连接是以A表为准,虽然B表中有三条记录,只会显示A.AA=B.AA和A中剩余的记录。 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的员工记录和没有任何员工的部门记录。 SELECT * FROM LIUJUN; AA BB AA BB -------------------- ---------------------- -------------------- ---------------------- B 10 B 2 B 10 B 2 2 rows selected SELECT * FROM LIUJUN2; AA BB AA BB -------------------- ---------------------- -------------------- ---------------------- A 1 B 10 B 2 B 10 B 2 SELECT * FROM LIUJUN A FULL OUTER JOIN LIUJUN2 B ON (A.AA=B.AA); 这是一个完全外连接,所以,会把A和B中的所有记录显示出来; AA BB AA BB -------------------- ---------------------- -------------------- ---------------------- B 10 B 2 B 10 B 2 A 1 ORACLE8i是不直接支持完全外连接的语法,也就是说不能在左右两个表上同时加上(+),下面是在ORACLE8i可以参考的完全外连接语法 select t1.id,t2.id from table1 t1,table t2 where t1.id=t2.id(+) union select t1.id,t2.id from table1 t1,table t2 where t1.id(+)=t2.id |