【问题标题】:Oracle SQL Left Join, WhereOracle SQL 左连接,在哪里
【发布时间】:2014-06-25 10:49:10
【问题描述】:

我一直在看一个旧的大学 SQL 并且偶然发现了一些我以前没有使用过并且不了解的语法..

SELECT * FROM TABLE1
LEFT JOIN TABLE 2 ON (TABLE1.COLUMN1 = TABLE1.COLUMN2), TABLE3 WHERE COLUMN1 LIKE '%%'
AND TABLE2.COLUMN1 = TABLE3.COLUMN1;

我对这部分声明没意见,

SELECT * FROM TABLE1
LEFT JOIN TABLE 2 ON (TABLE1.COLUMN1 = TABLE1.COLUMN2)

但是在加入的第二部分挣扎,

, TABLE3 WHERE COLUMN1 LIKE '%%'
AND TABLE2.COLUMN1 = TABLE3.COLUMN1;

有人能对外国概念有所了解吗?

我最初的猜测是逗号是列出要加入的表的一种方式,而不是为要加入的每个表输入 LEFT JOIN,但我现在不确定。

干杯。

【问题讨论】:

    标签: sql oracle join left-join


    【解决方案1】:

    逗号是旧式join 语法,几十年来已经过时(但完全受支持)。现在几乎每个人都喜欢明确的join 语法。

    逗号在功能上等同于cross join——一个完整的笛卡尔积。所以查询是一样的:

    SELECT *
    FROM TABLE1 LEFT JOIN
         TABLE 2
         ON TABLE1.COLUMN1 = TABLE1.COLUMN2 CROSS JOIN
         TABLE3
    WHERE COLUMN1 LIKE '%%' AND TABLE2.COLUMN1 = TABLE3.COLUMN1;
    

    我不会写这样的查询。首先,COLUMN1 LIKE '%%' 会产生错误,因为TABLE1TABLE3 有一个具有该名称的列。而且,TABLE2 上没有 join 条件。让我假设这些是拼写错误,你的意思是:

    SELECT *
    FROM TABLE1 LEFT JOIN
         TABLE2
         ON TABLE1.COLUMN1 = TABLE2.COLUMN2 CROSS JOIN
         TABLE3
    WHERE TABLE1.COLUMN1 LIKE '%%' AND TABLE2.COLUMN1 = TABLE3.COLUMN1;
    

    比较TABLE2.COLUMN1 = TABLE3.COLUMN1LEFT JOIN 变成INNER JOIN,因为NULL 值会导致比较失败。 TABLE3 上没有外连接。所以查询应该相当于:

    SELECT *
    FROM TABLE1 LEFT JOIN
         TABLE2
         ON TABLE1.COLUMN1 = TABLE2.COLUMN2 JOIN
         TABLE3
         ON TABLE2.COLUMN1 = TABLE3.COLUMN1
    WHERE COLUMN1 LIKE '%%' ;
    

    【讨论】:

    • 你是对的,这是一个错字!非常感谢您的解释。我的印象是它是从大约 2000 年开始使用的遗留语法。
    【解决方案2】:
    • 您可以输入“INNER JOIN”或仅输入“JOIN”来代替逗号
    • 您不必输入 COLUMN1 LIKE '%%' 它不会过滤任何内容
    • 这是一个奇怪的查询,左连接不会按预期工作,因为您稍后将 TABLE2 与 TABLE3 连接 (AND TABLE2.COLUMN1 = TABLE3.COLUMN1)。如果您期望左连接行为,则必须将此行放在左连接的子句中

    根据下面的 cmets 你可以这样重写这个查询:

    SELECT * 
      FROM TABLE1
     INNER JOIN TABLE3
      LEFT JOIN TABLE2 ON (TABLE1.COLUMN1 = TABLE1.COLUMN2 AND TABLE2.COLUMN1 = TABLE3.COLUMN1)
     WHERE COLUMN1 LIKE '%%' -- you can remove this line, the resultset will be the same
    ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-18
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多