如何在> 2个表(Oracle)上进行外连接

sdo*_*oca 7 oracle multiple-tables outer-join

我不确定如何描述我的表格结构,所以希望这是有道理的......

我有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
Run Code Online (Sandbox Code Playgroud)

Bil*_*win 10

所以我将您的架构可视化为:

A --o< B --o< C --< F >-- D
                      >-- E
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

  • 这是"绘制"我的架构的好方法.谢谢!我需要花一些时间来弄清楚你的select语句是否符合我的希望,但我认为我需要根据我对Jonathan的评论使用FULL join. (2认同)

sdo*_*oca 2

为了澄清起见,大写字母指表,小写字母指主/外键列。我可能应该像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
Run Code Online (Sandbox Code Playgroud)

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