如何在> 2表(Oracle)上进行外部加入

时间:2010-09-15 20:45:17

标签: oracle outer-join multiple-tables

我不确定如何描述我的表结构,所以希望这有意义......

我有3个层次关系的表,这样A与B之间有一对多的关系,而B又与C有一对多的关系。诀窍是允许B和C中的外键为空(即没有父母定义)。我也有D和E,与A,B或C(直接)无关。

最后,我有一个F,它是一个与C,D和E有多对一关系的连接表。它的所有字段(FK到其他表)都不可为空。

我想编写一个SQL语句,它连接单个结果集中的所有表。我知道我必须使用外部联接,因为我想要返回所有A,无论它是否在B中有子项,与B和C类似。

问题一:我一直在研究ANSI外连接语法(之前我只使用过Oracle“(+)”)并且找不到外连接超过2个表的示例。有人可以提供/指出一个例子吗?

问题二:是否可以根据连接表F包含表D和E中的记录?如果是这样,这是用外连接完成的吗?

谢谢!

修改

当然,在我发布这篇文章之后,我找到了一个回答问题1的例子。然而,问题2仍让我感到难过。

示例:

         SELECT A.a,
                B.b,
                C.c
           FROM A
FULL OUTER JOIN B ON B.a = A.a
FULL OUTER JOIN C ON C.b = B.b

4 个答案:

答案 0 :(得分:9)

所以我想象你的架构如下:

A --o< B --o< C --< F >-- D
                      >-- E

您当然可以进行多个连接,也可以将连接表达式与括号分组,就像对算术表达式进行分组一样。

SELECT ...
FROM A LEFT OUTER JOIN (
  B LEFT OUTER JOIN (
    C LEFT OUTER JOIN (
      F INNER JOIN D ON D.d = F.d
        INNER JOIN E ON E.e = F.e
      ) ON C.c = F.c
    ) ON B.b = C.b
) ON A.a = B.a

这些括号是不是子查询,它们只是对连接操作进行分组。

答案 1 :(得分:1)

 select a.*, b.*, c.*
 from a
 left outer join b on a.b_id = b.id
 left outer join c on a.c_id = c.id

现在,获得D,E&amp;那里的F变得更加棘手:

select c.*, d.*, e.*
from C
inner join f on c.id = f.c_id
inner join d on d.id = f.d_id
inner join e on d.id = f.e_id

然后我们把它们放在一起:

 select a.*, b.*, cde.*
 from a
 left outer join b on a.b_id = b.id
 left outer join 
 (select c.id as c_id, c.*, d.*, e.*
   from C
   inner join f on c.id = f.c_id
   inner join d on d.id = f.d_id
   inner join e on d.id = f.e_id) CDE
 on a.c_id = cde.c_id

答案 2 :(得分:1)

为了澄清,大写字母表示表格,小写字母表示主要/外键列。我可能应该把它写成类似于Quassnoi,但是因为它就是这样开始的。

这个SQL返回我正在寻找的结果:

         SELECT A.a,
                B.b,
                C.c,
                D.d,
                E.e
           FROM A
FULL OUTER JOIN B ON B.a = A.a
FULL OUTER JOIN C ON C.b = B.b
FULL OUTER JOIN F ON F.c = C.c
FULL OUTER JOIN D ON D.d = F.d
FULL OUTER JOIN E ON E.e = F.e

我尝试设置我的SQL,比如Bill,但是使用FULL联接而不是LEFT,但它没有返回与我相同的结果。我不能说我完全理解他的SQL,但是INNER加入过滤了一些结果。

答案 3 :(得分:0)

SELECT  a.*, b.*, c.*, d.*, e.*
FROM    a
LEFT JOIN
        b
ON      b.a = a.id
LEFT JOIN
        с
ON      c.b = b.id
LEFT JOIN
        f
ON      f.с = c.id
LEFT JOIN
        d
ON      d.id = f.d
LEFT JOIN
        e
ON      e.id = f.e