9

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

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

最后,我有 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

4 回答 4

10

所以我想象你的模式是这样的:

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

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

于 2010-09-15T21:02:15.913 回答
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

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

于 2010-09-27T19:54:12.010 回答
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 和 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
于 2010-09-15T20:53:48.857 回答
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
于 2010-09-15T21:00:12.390 回答