外连接: 包括 (1)左外连接(左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两表都不加限制) --右外连接 SQL> select e.ename,d.deptno,e.sal 2 from emp e,dept d 3 where e.deptno(+)=d.deptno;ENAME DEPTNO SAL ---------- ------ --------- SMITH 20 800.00 ALLEN 30 1600.00 WARD 30 1250.00 JONES 20 2975.00 MARTIN 30 1250.00 BLAKE 30 2850.00 CLARK 10 2450.00 SCOTT 20 3000.00 KING 10 5000.00 TURNER 30 1500.00 ADAMS 20 1100.00 JAMES 30 950.00 FORD 20 3000.00 MILLER 10 1300.00 40 --左外连接 select a.studentno, a.studentname, b.classname from students a, classes b where a.classid = b.classid(+);STUDENTNO STUDENTNAM CLASSNAME ---------- ---------- ------------------------------ 1 aa 一年级一班 2 bb 一年级二班 3 aa
很有可能sql语句写得有问题......
我看了没问题的 和B,C关联的字段都是A的字段
是不是有where条件啊?有where的话,可能给过滤掉了
呃 是有where条件 怎么过滤掉的呢?
where 条件如果直接写在最后面可能会过滤掉,我们需要用 (a is null or a = ...) 来加过滤,最好是直接写成 left join ... on 这种不容易造成错觉,连接的条件就加在连接上,过滤的条件就加在 where 上,更容易理清。where 中如果要过滤“右表”时,需要写成 (右表.连接任意一个字段 is null or 右表的条件=xxx),右表.连接任意一个字段 is null 表示左连接已经命中的(右表不存在嘛),不需要再过滤它了,只需要对 右表已经连接的记录做过滤。
右外连接 SQL> select e.ename,d.deptno,e.sal 2 from emp e,dept d 3 where e.deptno(+)=d.deptno;
外连接: 包括
(1)左外连接(左边的表不加限制)
(2)右外连接(右边的表不加限制)
(3)全外连接(左右两表都不加限制)
--右外连接
SQL> select e.ename,d.deptno,e.sal
2 from emp e,dept d
3 where e.deptno(+)=d.deptno;ENAME DEPTNO SAL
---------- ------ ---------
SMITH 20 800.00
ALLEN 30 1600.00
WARD 30 1250.00
JONES 20 2975.00
MARTIN 30 1250.00
BLAKE 30 2850.00
CLARK 10 2450.00
SCOTT 20 3000.00
KING 10 5000.00
TURNER 30 1500.00
ADAMS 20 1100.00
JAMES 30 950.00
FORD 20 3000.00
MILLER 10 1300.00
40
--左外连接
select a.studentno, a.studentname, b.classname
from students a, classes b
where a.classid = b.classid(+);STUDENTNO STUDENTNAM CLASSNAME
---------- ---------- ------------------------------
1 aa 一年级一班
2 bb 一年级二班
3 aa
我看了没问题的 和B,C关联的字段都是A的字段
呃 是有where条件 怎么过滤掉的呢?
SQL> select e.ename,d.deptno,e.sal
2 from emp e,dept d
3 where e.deptno(+)=d.deptno;
详解Oracle多种表连接方式