这是最好的时代,这是最坏的时代,这是智慧的时代,这是愚蠢的时代;这是信仰的时期,这是怀疑的时期;这是光明的季节,这是黑暗的季节;这是希望之春,这是失望之冬;人们面前有着各样事物,人们面前一无所有;人们正在直登天堂;人们正在直下地狱。
我也要与时俱进了,被itpub2.0牵着尾巴,拼命的奔跑,不停的灌水...
【原】Oracle中Left Outer Join和外关联(+)的区别
上一篇 / 下一篇 2008-03-23 16:22:37 / 个人分类:数据库专区
查看( 456 ) /
评论( 11 )
TAG:
-
wdollar发布于2008-03-23 16:35:18
-
最后那个写成这个样子就可以了
SELECT d.depID,d.depName,e.empName,d.delflag
FROM departments d, employees e
WHERE d.depID = e.depID(+)
AND e.depID(+)=3
ORDER BY d.depID;
-
zhangweicai74
发布于2008-03-23 16:40:02
-
星期天还这么努力,
学习了
-
bq_wang
发布于2008-03-23 16:43:45
-
好像不全等效,你试试这个
Create Table student
(
StuId Number(38,0),
StuName Varchar2(20)
);
Create Table StuClass
(
ClsId Number(38,0),
ClsName Varchar2(20)
);
Create Table Grade
(StuID Number(38,0),
ClsID Number(38,0),
Gradetype Varchar2(20)
);
Insert Into student Values(1,'甲');
Insert Into student Values(2,'乙');
Insert Into StuClass Values(1,'语文');
Insert Into StuClass Values(2,'数学');
Insert Into StuClass Values(3,'英语');
Insert Into Grade Values(1,1,'A');
Insert Into Grade Values(1,2,'B');
Insert Into Grade Values(2,1,'A');
Commit;
Select stu.stuid,stu.stuname,cls.clsid,cls.clsname,grd.stuid,grd.clsid,grd.gradetype
From student stu
Left Join grade grd On grd.stuid=stu.stuid And grd.gradetype='B'
Left Join stuclass cls On grd.clsid =cls.clsid
Select stu.stuid,stu.stuname,cls.clsid,cls.clsname,grd.stuid,grd.clsid,grd.gradetype
From student stu,grade grd ,stuclass cls
where stu.stuid(+)=grd.stuid And grd.gradetype(+)='B'
and grd.clsid =cls.clsid
QUOTE:
原帖由 wdollar 于 2008-3-23 16:35 发表

最后那个写成这个样子就可以了
SELECT d.depID,d.depName,e.empName,d.delflag
FROM departments d, employees e
WHERE d.depID = e.depID(+)
AND e.depID(+)=3
ORDER BY d.depID;
-
bq_wang
发布于2008-03-23 16:45:15
-
上周5帮同事写的,感觉这两个语法还是不能全等效的
你不用向我这个菜鸟学习啊
QUOTE:
原帖由 zhangweicai74 于 2008-3-23 16:40 发表

星期天还这么努力,
学习了
-
wdollar发布于2008-03-23 17:10:47
-
QUOTE:
原帖由 bq_wang 于 2008-3-23 16:43 发表

好像不全等效,你试试这个
Create Table student
(
StuId Number(38,0),
StuName Varchar2(20)
);
Create Table StuClass
(
ClsId Number(38,0),
ClsName Varchar2(20)
);
Create Table Grade
(StuID Number(38,0),
ClsID Number(38,0),
Gradetype Varchar2(20)
);
Insert Into student Values(1,'甲');
Insert Into student Values(2,'乙');
Insert Into StuClass Values(1,'语文');
Insert Into StuClass Values(2,'数学');
Insert Into StuClass Values(3,'英语');
Insert Into Grade Values(1,1,'A');
Insert Into Grade Values(1,2,'B');
Insert Into Grade Values(2,1,'A');
Commit;
Select stu.stuid,stu.stuname,cls.clsid,cls.clsname,grd.stuid,grd.clsid,grd.gradetype
From student stu
Left Join grade grd On grd.stuid=stu.stuid And grd.gradetype='B'
Left Join stuclass cls On grd.clsid =cls.clsid
Select stu.stuid,stu.stuname,cls.clsid,cls.clsname,grd.stuid,grd.clsid,grd.gradetype
From student stu,grade grd ,stuclass cls
where stu.stuid(+)=grd.stuid And grd.gradetype(+)='B'
and grd.clsid =cls.clsid
参照第一个SQL,第二个SQL中where语句的第一个条件似乎有误。
这种多表的关联我也没写过,不过下面这个SQL的结果和第一个SQL一致:
Select stu.stuid,stu.stuname,cls.clsid,cls.clsname,grd.stuid,grd.clsid,grd.gradetype
From student stu,grade grd ,stuclass cls
where stu.stuid=grd.stuid(+) And grd.gradetype(+)='B'
and grd.clsid =cls.clsid(+)
-
bq_wang
发布于2008-03-23 17:56:09
-
tks
QUOTE:
原帖由 wdollar 于 2008-3-23 17:10 发表

参照第一个SQL,第二个SQL中where语句的第一个条件似乎有误。
这种多表的关联我也没写过,不过下面这个SQL的结果和第一个SQL一致:
Select stu.stuid,stu.stuname,cls.clsid,cls.clsname,grd.stuid,grd.clsid,grd.gradetype
From student stu,grade grd ,stuclass cls
where stu.stuid=grd.stuid(+) And grd.gradetype(+)='B'
and grd.clsid =cls.clsid(+)
-
java2001发布于2008-03-23 20:26:55
-
但这个不代表Oracle中Left Outer Join和外关联(+)有区别
SELECT d.depID,d.depName,e.empName d.delflag
FROM departments d
LEFT OUTER JOIN employees e
ON d.depID = e.depID AND e.depID=3
ORDER BY d.depID;
中你没有和employees 做外关连,而是和
select * from employees where depID=3
的结果集做了外关联
-
komman
发布于2008-03-24 11:04:50
-
难道ORACLE 的外关联不是外关联?
-
komman
发布于2008-03-24 11:05:36
-
反正我在ORACLE 里没去用LEFT OUTER JOIN
一直使用(+)
没出现过什么问题
-
lastwinner
发布于2008-03-24 13:09:45
-
楼主概念不清晰,鉴定完毕

-
jzl780821
发布于2008-03-24 14:25:58
-
left(right/full) outer join
关键字能明晰地区分左外、右外、全连接的对象,即关键字的左面、右面的对象。全外连接则是两侧的对象。
这是标准的ANSI的写法。
而外部连接运算符(+)在连接中应用时所得的左外、右外(没有全外连接)称呼则是由其在连接的条件表达式运算符的左侧还是
右侧来确定(仅仅是称呼),那么至于Oracler如何决定运算规则则是根据外部连接运算符是限定的那张表的哪个字段来进行连接的。(即当外部运算符限定的是同一个表的同一个字段,那么不管它写在条件运算符的左侧(叫左外部连接)还是右侧(叫右外连接),结果是一样的)
这是oracle中的传统写法。
