Oracle中LeftOuterJoin和外关联(+)的区别
外关联是Oracle数据库的专有语句
Left Outer Join则是SQL-92的标准语句
通常认为这两个SQL是可以等效的,但还是有些细微的差别。
⼀般说来,外关联的等值条件等效于Left Outer Join中的on语句;两个where中其他语句是⼀样的。
但是Left Outer Join中的其他条件(⾮表连接)出现在On关键词后⾯还是出现在Where关键词后⾯是不⼀样的,这样的语句很难⽤外关联进⾏同义转义。
下⾯我们先看⼀个测试数据,和⼀个测试案例
创建⼀个部门表和员⼯表
CREATE TABLE departments
(
depID NUMBER(38,0),
depName VARCHAR2(20),
delFlag NUMBER(1,0)
);
CREATE TABLE employees
(
empID NUMBER(38,0),
empName VARCHAR2(20),
depID NUMBER(38,0),
delFlag NUMBER(1,0)
);
INSERT INTO departments VALUES(1,'Finacle',0);
INSERT INTO departments VALUES(2,'Marketing',0);
INSERT INTO departments VALUES(3,'HR',1);
INSERT INTO departments VALUES(4,'IT',0);
INSERT INTO employees VALUES(1,'wbq',1,0);
INSERT INTO employees VALUES(2,'czh',2,0);
INSERT INTO employees VALUES(3,'chh',1,0);
INSERT INTO employees VALUES(4,'wal',2,0);
INSERT INTO employees VALUES(5,'ddd',3,0);
COMMIT;
以下为测试例⼦
--列出部门ID为3的部门和员⼯信息,不管该部门是否有员⼯
SELECT d.depID,d.pName
FROM departments d
LEFT OUTER JOIN employees e
ON d.depID = e.depID
WHERE d.depID =3
ORDER BY d.depID;
--和上⾯等效
SELECT d.depID,d.pName
FROM departments d, employees e
WHERE d.depID = e.depID(+)
AND d.depID =3
ORDER BY d.depID;
--该例⼦可能不是很恰当,d.depID=3表⽰⾸先进⾏全左连接,然后查depID=3的纪录,如果该部门中不到对应的员⼯,则该部门员⼯则为NULL,同时都显⽰部门信息。SELECT d.depID,d.pName,d.delflag
FROM departments d
LEFT OUTER JOIN employees e
ON d.depID = e.depID AND e.depID=3
sql left join 多表连接ORDER BY d.depID;
--和上⾯不等价,差别在于能够到⽆对应员⼯的部门和有对应员⼯的部门,却不到该部门⽆员⼯的部门。
SELECT d.depID,d.pName,d.delflag
FROM departments d, employees e
WHERE d.depID = e.depID(+)
AND (e.depID=3 or e.depID is NULL)
ORDER BY d.depID;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论