zoukankan      html  css  js  c++  java
  • 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语句中一个表外连接两个表。

  • 相关阅读:
    pgspider timescale 扩展docker 镜像
    pgspider perl 语言扩展
    postgresql_anonymizer 方便的数据脱敏扩展
    pgspider jsonb_deep_sum 扩展docker 镜像以及简单试用
    pgspider pgddl 扩展doker 镜像以及试用
    pgspider wal2json doker 镜像
    pgspider Citus节点数据移动操作
    pgspider Citus worker 账户密码问题
    pgspider Citu 副本以及节点移除简单学习
    Citus 官方docker demo 中membership-manager原理简单说明
  • 原文地址:https://www.cnblogs.com/prettymdx/p/2126217.html
Copyright © 2011-2022 走看看