2009-10-23 128 views
1

为什么不能在Oracle中使用?有没有办法在oracle中执行多个左外连接?

有没有办法让这项工作?

FROM table1 a, 
    table2 b, 
    table3 c 
WHERE a.some_id = '10' 
AND a.other_id (+)= b.other_id 
AND a.other_id (+)= c.other_id 

我想table1被左外加入了对多表...

如果我试图改变它使用一个ANSI加入,我得到的编译错误。我做了以下操作:

FROM table2 b, table3 c 
LEFT JOIN table1 a ON a.other_id = b.other_id and a.other_id = c.other_id 

回答

7

好的,从Oracle文档中查看examples,我对语法的回忆是正确的,所以我将我的意见转化为答案。假设你的目标是一个左外连接,其中A是基表,并且你加入了来自B和C的匹配行,按如下方式重写你的查询(注意,我只是改变了前缀;我喜欢让源行集在正确的)。

FROM table1 a, 
    table2 b, 
    table3 c 
WHERE a.some_id = '10' 
AND b.other_id (+)= a.other_id 
AND c.other_id (+)= a.other_id 

如果这不是你想要做什么,然后将查询borked:你正在做一个笛卡儿连接B和C,然后尝试外从部分结果为连接,以对A的一个附加谓词,这没有多大意义。

+0

我想澄清。我的印象是,如果(+)在某列的右侧,那么LEFT JOIN就在那张桌子上......我错了吗? 是的我想table1 a是基表 – Omnipresent

+0

你错了 - 看看我提供的 – kdgregory

+0

这样的例子链接。左连接正在完成一个??这意味着我们将获得 – Omnipresent

5

使用ansi连接。他们更清晰的国际海事组织。 BUT由于某些原因,它们不能与物化视图一起工作...

+0

+1 - 它更清晰,但是Oracle直到(我相信)10g才支持它,所以有很多旧语法的遗留代码。使用一致的语法可能会更好。 – kdgregory

+0

@kdgregory:不,我在9i中使用了ANSI JOIN。 –

0

在oracle中,不能将同一个表中的外部表连接到多个其他表中。您可以创建视图并加入其中,然后加入该视图。注意,你也不能外连接到一个子选择,所以这里也不是一个选项。

2

你可以做这样的事情。

FROM table1 a,  table2 b,  table3 c 
WHERE a.some_id = '10' 
AND a.other_id = b.other_id(+) 
AND a.other_id = c.other_id(+) 
+0

再次,我认为把(+)放在右边会使table2和table3成为基表。在那里我想table1一个基地 – Omnipresent

+0

没有。 table1基于上面的查询。 –

+0

同意。由于原始查询在table1中的some_id上​​具有相等条件,因此将table1外连接到其他表并不合理,这是原始查询的作用。大概你想要的是将其他两个表外连接到table1,这是Henry的查询所要做的。 –

2

我想单独解决您的问题,这部分:

If I try to change it to ANSI join I get compilation errors. I did the following: 

FROM table2 b, table3 c 
LEFT JOIN table1 a ON a.other_id = b.other_id and a.other_id = c.other_id 

在ANSI连接,至少在甲骨文中,你需要整整两个行源工作。在你的例子中,LEFT JOIN运算符的table3和table1作为其操作数;所以你不能在ON子句中引用“b.otherid”。每个附加表需要一个新的连接运算符。

我相信你正在尝试做的是外连接表2和表3至表1.所以,你应该做的是:

FROM table1 a LEFT JOIN table2 b ON b.other_id = a.other_id 
       LEFT JOIN table3 c ON c.other_id = a.other_id 

或亨利高的查询,如果您要使用Oracle特定的语法。

0

你可以关闭过程尝试以下(表b和c是所述BASE) FROM(SELECT other_id FROM table2中 UNION SELECT other_id FROM表3)b LEFT JOIN TABLE1一个b.other_id = a.other_id

但是我又是一个Oracle诺诺

相关问题