【问题标题】:SQL joins using (+) operator in where clause在 where 子句中使用 (+) 运算符进行 SQL 连接
【发布时间】:2015-07-08 21:47:40
【问题描述】:

我正在尝试重写一个使用 where 子句中的运算符来代替 from 子句的 Oracle SQL 查询。我知道如何判断是左连接还是右连接,但我不知道该怎么做...这是引用列号吗???

 where alias.column(+) = 1

这是想告诉我什么?我将简单地重写为:

 left join table
 on alias.column = 1

一个是实际值吗?如果是这样,为什么要使用(+)?如果这是一个基本问题,我不熟悉 SQL 很抱歉。谷歌也不是一件容易的事......我已经尝试了最后一个小时,找不到任何解释这个加入的东西......

【问题讨论】:

    标签: sql oracle join operators


    【解决方案1】:

    看看这个:" (+) = " operator in oracle sql in where clause (+) 是用于连接的旧 Oracle 语法,但已弃用。是的,你可以(并且应该)这样重写它。

    【讨论】:

      【解决方案2】:

      当某些字段的数据为null 并且您仍想打印所有数据时,它实际上很有用。请找到SQL fiddle here 以便更好地理解:

      在这种情况下,第一个查询不会给您任何结果。但是,如果数据为空,带有 (+) 运算符的第二个查询将给出所有带有 null 的行。

      【讨论】:

      • 这是正确答案。 (+) 进行连接和“外连接”意味着如果 alias.column 中有非空值,它将尝试与 1 匹配。
      【解决方案3】:

      我没有这个答案的来源,但在我的测试中,与文字相比,(+) 似乎什么也没做。以下两个查询返回相同的空集。

      WITH table1 AS
       (SELECT LEVEL num_col FROM dual CONNECT BY LEVEL <= 100)
      ,    table2 AS
       (SELECT LEVEL * 2 num_col FROM dual CONNECT BY LEVEL <= 50)
      SELECT *
        FROM table1 a_tab
            ,table2 b_tab
       WHERE b_tab.num_col(+) = 1
       ORDER BY 1 DESC;
      
      WITH table1 AS
       (SELECT LEVEL num_col FROM dual CONNECT BY LEVEL <= 100)
      ,    table2 AS
       (SELECT LEVEL * 2 num_col FROM dual CONNECT BY LEVEL <= 50)
      SELECT *
        FROM table1 a_tab
            ,table2 b_tab
       WHERE b_tab.num_col = 1
       ORDER BY 1 DESC;
      

      但是,将符号放在与列的比较中会产生预期的左连接

      WITH table1 AS
       (SELECT LEVEL num_col FROM dual CONNECT BY LEVEL <= 100)
      ,    table2 AS
       (SELECT LEVEL * 2 num_col FROM dual CONNECT BY LEVEL <= 50)
      SELECT *
        FROM table1 a_tab
            ,table2 b_tab
       WHERE b_tab.num_col(+) = a_tab.num_col
       ORDER BY 1 DESC;
      

      输入一个值会产生一个交叉连接

      WITH table1 AS
       (SELECT LEVEL num_col FROM dual CONNECT BY LEVEL <= 100)
      ,    table2 AS
       (SELECT LEVEL * 2 num_col FROM dual CONNECT BY LEVEL <= 50)
      SELECT *
        FROM table1 a_tab
            ,table2 b_tab
       WHERE b_tab.num_col(+) = 2
       ORDER BY 1 DESC;
      

      虽然我在 11g r2 中工作,所以在您的版本上可能不一样。我想说最好的解决方案是比较数据集,以确保您仍然返回您对上一个查询的期望。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-20
        • 2014-06-15
        • 1970-01-01
        • 1970-01-01
        • 2015-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多