zoukankan      html  css  js  c++  java
  • postgresql/lightdb a [left/right] join b on true的含义

    最近遇到个示例

    Table A join table B ON TRUE

    以及外连接

    Table A LEFT outer join table B on TRUE

    在非外连接中,JOIN ON TRUE相当于CROSS JOIN,CROSS关键字可选(CROSS JOIN后不能用ON),相当于笛卡尔乘积,生成m x n行结果,如果n没有记录,则返回0行

    而在外关联中则不同,返回整个左侧表中的记录,如下:

    CREATE TABLE a (i INT);
    CREATE TABLE b (i INT);
    INSERT INTO a VALUES (1),(2),(3);
    
    SELECT a.i, b.i FROM a LEFT JOIN b ON TRUE ;

    除此之外,外连接可以直接用括号()指定关联顺序关系,且保留主表,这是一直以来没有发现的。如下:

    postgres=# SELECT a.i, x.i,x.xi FROM a LEFT JOIN (select x.i as xi,c.i as i from b as x LEFT JOIN c on true) x ON TRUE ;
     i | i | xi 
    ---+---+----
     1 | 4 |  4
     1 | 5 |  4
     2 | 4 |  4
     2 | 5 |  4
     3 | 4 |  4
     3 | 5 |  4
    (6 rows)
    
    postgres=# SELECT a.i, x.i FROM a LEFT JOIN (b as x LEFT JOIN c on true) x ON TRUE ;
    ERROR:  column reference "i" is ambiguous
    LINE 1: SELECT a.i, x.i FROM a LEFT JOIN (b as x LEFT JOIN c on true...
    postgres=# SELECT * FROM a LEFT JOIN (b as x LEFT JOIN c on true) x ON TRUE ;
     i | i | i 
    ---+---+---
     1 | 4 | 4
     1 | 4 | 5
     2 | 4 | 4
     2 | 4 | 5
     3 | 4 | 4
     3 | 4 | 5
    (6 rows)

    不明确指定的情况下,()外连接可以返回所有外连接的字段。和普通的外连接一样。

    注:在postgresql中,所有的右外连接都会被先转换为左外连接,以减少一种优化处理。

    对于外关联而言,nullable-side是一个非常重要的点(指的是不匹配时返回空的那些表),涉及到for update和优化的适用性。

  • 相关阅读:
    __FILE__ php解析
    一时之悟
    apidoc生成API文档,Thinkphp6使用ThinkPHP-ApiDoc
    MySQL中的共享锁与排他锁
    Linux 挂载点目录及其作用
    IDE Eval Resetter:JetBrains 全家桶无限试用插件
    开发工具地址
    快能力和慢能力
    nginx 配置隐藏index.php效果
    Object.assign 是浅拷贝还是深拷贝
  • 原文地址:https://www.cnblogs.com/zhjh256/p/15643433.html
Copyright © 2011-2022 走看看