`

[转]Oracle中Left Outer Join和外关联(+)的区别

阅读更多

外关联是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;

 

以下为测试例子

 

--列出部门ID3的部门和员工信息,不管该部门是否有员工

SELECT d.depID,d.depName,e.empName

 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.depName,e.empName

 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.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;

--和上面不等价,差别在于能够找到无对应员工的部门和有对应员工的部门,却找不到该部门无员工的部门。

SELECT d.depID,d.depName,e.empName,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;

 

 

分享到:
评论

相关推荐

    oracle性能优化技巧

    ORACLE的优化器共有3种 A、RULE (基于规则) b、COST (基于成本) c、CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS 。 ...

    Oracle中sql语句(+)符号代表连接的使用讲解

    oracle中sql语句(+)符号代表连接 (+)在=前边为右连接 (+)在=后边为左连接 SELECT a.*, b.* from a(+) = b就是一个右连接,等同于select a.*, b.* ...LEFT JOIN 或LEFT OUTER JOIN 列出左表中的所有行,若左表中某行

    MySQL常见面试题(表连接类型,count(*),count(列),count(1)的区别,索引,存储引擎,锁,优化)

    左外连接:使用left outer join,表示即使左表存在未关联数据,也被查询出来。在left outer join左侧的表叫做左表,右侧的表叫做右表。(能够查询出关联数据和左表没有关联的数据,在左表的下方进行展示) 右外连接...

    Oracle SQL连接查询总结.docx

    缺省情况下是inner join,开发中使用的left join和right join属于outer join,另外outer join还包括full join.下面我通过图标让大家认识它们的区别。 现有两张表,Table A 是左边的表。Table B 是右边的表。其各有四条...

    Oracle 外连接实现代码

    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....

    视频教程读书笔记之oracle从入门到精通

    [LEFT | RIGHT | FULL OUTER JOIN 表名称2]; 1. 交叉连接:CROSS JOIN,主要功能是产生笛卡儿积,简单实现多表查询; SELECT * FROM emp CROSS JOIN dept; 2. 自然连接:NATURAL JOIN,自动使用关联字段消除...

    Oracle 数据库连接查询SQL语句

    左连接 (left [outer] join) 左外连接就是将左表的所有数据分别于右表的每条数据进行连接组合,返回的结果除内连接的数据外,还有左表中不符合条件的数据,并在右表的相应列中填上null值。 SQL语句如下: select * ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

     删除“开始”/“程序”中所有Oracle的组和图标。  删除所有与Oracle相关的目录,包括: C:\Program file\Oracle目录。 ORACLE_BASE目录。 C:\Documents and Settings\系统用户名、LocalSettings\Temp目录下的...

    oracle sql of extracting table structure

    left outer join (select cu.table_name pk_tab_name ,cu.column_name pk_col_name from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type =...

    阿里巴巴大数据之路——数据技术篇.pdf

    实例参考如下: SQL的Join语法有很多, inner join(等值连接) 只返回两个表中联结字段相等的⾏, left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录, right join(右联接) 返回包括右表中的...

    精通SQL数据库连接.doc

    一些数据库,如SQL Server, Oracle和DB2也支持JOIN HINT关键字的概念。这些关键字被插入到JOIN声明中来控制JOIN被处理的顺序。例如,一个MERGE JOIN会在处理其他连接之前将两个表格连接在一起。HASH JOIN会将一个...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例051 前置运算符和后置运算符的区别 82 实例052 使用位运算对数字进行加密和解密 83 2.3 包含语句 84 实例053 提高代码重用率 84 实例054 包含数据库连接文件 85 实例055 包含网站头文件 86 实例056 包含网站尾...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例051 前置运算符和后置运算符的区别 82 实例052 使用位运算对数字进行加密和解密 83 2.3 包含语句 84 实例053 提高代码重用率 84 实例054 包含数据库连接文件 85 实例055 包含网站头文件 86 实例056 包含网站尾...

    MYSSQL_MSS_ORACLE经典SQL.pdf

    from Student left Outer join SC on Student.S#=SC.S# group by Student.S#,Sname 4、--查询姓“李”的老师的个数; select count(distinct(Tname)) from Teacher where Tname like '李%'; 5、--查询没...

    经典全面的SQL语句大全

     A、left outer join:  左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c  B:right outer join:  ...

    MYSQL_MSS_ORACLE经典SQL

    from Student left Outer join SC on Student.S#=SC.S# group by Student.S#,Sname 4、--查询姓“李”的老师的个数; select count(distinct(Tname)) from Teacher where Tname like '李%'; 5、--查询没...

    SQL语法大全

    以上几个游标类型将直接影响到Recordset对象所有的属性和方法,以下列表说明他们之间的区别。 ------------------------------------------------------------- Recordset属性 adOpenForwardOnly adOpenKeyset ...

    SQL培训第一期

    1.6.4 全外连接(full outer join) 1.6.4.1 说明 完整外部联接返回左表和右表中的所有行;当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值;如果表之间有匹配行,则整个结果集行包含基表的数据值...

    C#开发经验技巧宝典

    0902 如何使用LEFT OUTER JOIN查询 526 0903 如何使用RIGHT OUTER JOIN查询 527 0904 利用CASE语句查询结果 527 19.8 交叉表 528 0905 Access中利用TRASFORM分析数据 528 0906 Access中利用TRASFORM动态...

Global site tag (gtag.js) - Google Analytics