SQL在where子句

时间:2015-07-08 21:47:41

标签: sql oracle join operators

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

 where alias.column(+) = 1

这是什么试图告诉我的?我只想改写成:

 left join table
 on alias.column = 1

一个是实际值吗?如果是,那么为什么要使用(+)?我不熟悉SQL,如果这是一个基本问题,请对不起。 google也不是一件容易的事......我已经尝试了最后一小时,找不到任何解释这个加入的内容......

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

在此,第一个查询不会给你任何结果。但如果数据为空,则使用(+)运算符的第二个查询将为所有行提供null

答案 2 :(得分:0)

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

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工作,所以你的版本可能不一样。我想说最好的解决方案是比较数据集,以确保您仍然可以返回您对上一个查询的期望。