外连接(+)的旧Oracle语法是否始终等同于新语法?

时间:2011-10-26 19:02:42

标签: oracle left-join

我想知道是否总是可以使用旧的Oracle语法LEFT JOIN重写(+)。特别是,我尝试使用(+)

表达以下查询
SELECT *
FROM table_1 a
LEFT JOIN table_2 b ON (b.table1_id = a.id AND b.other_field = 'value1')

没有成功。有可能吗?
谢谢。

2 个答案:

答案 0 :(得分:7)

我猜你在b.other_field的测试中没有使用(+)运算符.. 这应该有效:

SELECT *
FROM table_1 a, table_2 b 
WHERE b.table1_id(+) = a.id 
AND b.other_field(+) = 'value1'

答案 1 :(得分:3)

如果我没记错的话,在Oracle的旧外连接语法中重写ANSI连接并不总是总是,因为执行顺序可以改变返回的行。

“没有成功”是什么意思?你收到错误了吗?你弄错了行吗?你找错了专栏吗?

左连接将保留table_1中的所有行。旧式Oracle语法的基本形式是具有WHERE子句的笛卡尔积,以及另一个表上的“+”标记。 (这不包括你的整个WHERE子句。这是故意的。)

SELECT *
FROM table_1 a, table_2 b
WHERE a.id = b.table1_id(+)

例如,请参阅AskTom

进行故障排除。 。

如果您从查询开始

SELECT *
FROM table_1 a
LEFT JOIN table_2 b ON (b.table1_id = a.id AND b.other_field = 'value1')

并删除了别名,你有

SELECT *
FROM table_1
LEFT JOIN table_2 ON (table_2.table1_id = table_1.id AND 
                      table_2.other_field = 'value1')

实际上是否有名为table_2.table1_idtable_1.id的列?这有用吗?

如果这不是问题,那么开始就更简单了。试试这个。

SELECT table_1.id, table_2.table1_id
FROM table_1
INNER JOIN table_2 ON (table_2.table1_id = table_1.id);

这有用吗?接下来试试这个。

SELECT table_1.id, table_2.table1_id
FROM table_1
LEFT JOIN table_2 ON (table_2.table1_id = table_1.id);

如果可行,请尝试添加JOIN子句的其余部分。