• Oracle外连接


    今天开发过程中,遇到了一个多条件外连接的问题,最后因为外连接的局限性,只好通过把其中不需要外连接的条件SELECT出来以减少连接条件的方法来解决。借此机会总结一下外连接。

    Oracle官方提供了两种方式来实现外连接,一种是在where子句中使用Join操作符(+),另一种是在from子句中使用left outer join/right outer join/full outer join。第二种方式是通用的,也是Oracle官方建议的:Oracle recommends that you use the FROM clause OUTER JOIN syntax rather than the Oracle join operator;而第一种方式只能用在Oracle数据库中,并且包含(+)的where子句中不可以用or、in和子查询。

    1. 左/右/全外连接的简单用法

    (1)左外连接

    右条件所在的表必须严格进行相等连接条件的匹配,而左条件所在的表除了匹配相等连接条件外,还可以显示无法匹配连接条件的数据。

    比如要显示所有员工及对应部门的记录,包括没有部门的员工记录,可以这样写:

    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(+);

    不难看出,left outer join这种方式更容易理解。

    (2)右外关联:

    左条件所在的表必须严格进行相等连接条件的匹配,而右条件所在的表除了匹配相等连接条件外,还可以显示无法匹配连接条件的数据!

    比如要查询所有员工与对应部门的记录,包括没有任何员工的部门记录。

    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;

    (3)全外关联

    oracle对于全连接不支持在连接条件的左右都加(+),只能在from子句中使用full outer join ,在on子句中加连接条件。

    比如,查询所有员工及对应部门的记录,包括没有对应部门的员工记录和没有任何员工的部门记录。

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

     2. 注意事项

    有多个连接条件的两个表在连接时如果没有都写上“(+)”,那么oracle视同简单的等值内连接。这也是oracle官方声明的:If Aand B are joined by multiple join conditions, then you must use the (+) operator in all of these conditions. If you do not, then Oracle Database will return only the rows resulting from a simple join, but without a warning or error to advise you that you do not have the results of an outer join.

    同时,Oracle也不允许在一个SQL语句中一个表外连接两个表。

  • 相关阅读:
    [洛谷P2783]有机化学之神偶尔会做作弊
    %你赛题解
    TCP协议中的三次握手和四次挥手(图解)
    堆,栈,内存
    java原生数据类型和引用类型
    XHTML 是以 XML 格式编写的 HTML
    TCP和UDP?
    HTTP和HTTPS的区别?
    <!DOCTYPE> 声明
    ASCII和万国码
  • 原文地址:https://www.cnblogs.com/prettymdx/p/2126217.html
Copyright © 2020-2023  润新知