如何在>;2个表(Oracle)

如何在>;2个表(Oracle),oracle,outer-join,multiple-tables,Oracle,Outer Join,Multiple Tables,我不知道如何描述我的表结构,所以希望这是有意义的 我有3个分层关系的表,这样A与B有一对多的关系,B与C又有一对多的关系。诀窍是允许B和C中的外键为null(即未定义父项)。我也有D和E,与A、B或C(直接)没有关系 最后,我有一个F,它是一个与C、D和E有多对一关系的联接表。它的任何字段(FK到其他表)都不能为空 我想编写一个SQL语句,将所有表连接到一个结果集中。我知道我必须使用外部联接,因为我希望返回所有A,无论它是否在B中有子级,以及与B和C类似的子级 问题一:我一直在研究ANSI外部联

我不知道如何描述我的表结构,所以希望这是有意义的

我有3个分层关系的表,这样A与B有一对多的关系,B与C又有一对多的关系。诀窍是允许B和C中的外键为null(即未定义父项)。我也有D和E,与A、B或C(直接)没有关系

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

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

问题一:我一直在研究ANSI外部联接语法(我以前只使用过Oracle“(+)”),没有找到外部联接两个以上表的示例。有人能举个例子吗

问题二:是否可以基于联接表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
现在,把D,E&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

因此,我将您的模式可视化如下:

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

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

为了澄清,大写字母表示表,小写字母表示主键/外键列。我可能应该写类似于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

我试着像Bill一样设置SQL,但使用完全联接而不是左联接,但它没有返回与我相同的结果。我不能说我完全理解他的SQL,但是内部连接过滤了一些结果。

谢谢!我们必须在同一时间发布。您可能不希望完全外部连接;它存在,但很少使用(或有用)。您没有指定F中的哪些列与其他每个表连接-这意味着没有人可以给出明确的答案。请发布一些示例数据和您想要获得的记录集,好吗?A、B和C都不是很有用的名称。@Jonathan,据我所知,ANSI连接(我承认我只是在学习)我需要使用完全连接,因为我需要表A中的所有记录,即使表B中没有子记录,表B中的所有记录,即使表A中没有定义外键。左或右连接只能为关系的一个方向提供null。表F只有3个字段,它们是表C、D和E的外键。比尔在回答“绘制”模式时做得很好。这是“绘制”我的模式的好方法。谢谢我需要花一些时间来弄清楚你的select语句是否符合我的期望,但我确实认为我需要根据我对Jonathan的上述评论使用完全联接。
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
         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