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)
这些括号不是子查询,它们只是对连接操作进行分组.
为了澄清起见,大写字母指表,小写字母指主/外键列。我可能应该像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过滤了一些结果。
| 归档时间: |
|
| 查看次数: |
48951 次 |
| 最近记录: |