我想知道是否总是可以使用旧的Oracle语法LEFT JOIN
重写(+)
。特别是,我尝试使用(+)
SELECT *
FROM table_1 a
LEFT JOIN table_2 b ON (b.table1_id = a.id AND b.other_field = 'value1')
没有成功。有可能吗?
谢谢。
答案 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_id
和table_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子句的其余部分。