我不确定如何描述我的表结构,所以希望这有意义......
我有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
答案 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