【发布时间】:2012-03-28 04:59:56
【问题描述】:
我正在尝试学习 ansi-92 SQL 标准,但我似乎并不完全理解它(我也是 ansi-89 标准以及一般数据库的新手)。
在我的示例中,我有三个表王国 -
- 可能有没有物种或家庭的王国。
- 可能有没有物种或种类的科。
- 可能有些物种没有王国或家族。
为什么会发生这种情况?
假设生物学家发现了一个新物种,但他没有将其归类为王国或科,创建了一个没有物种并且不确定它应该属于哪个王国的新科,等等。
这是一个小提琴(见最后一个查询):http://sqlfiddle.com/#!4/015d1/3
我想做一个查询来检索每个王国,每个物种,但不是那些没有物种的家庭,所以我做了这个。
select *
from reino r
left join (
familia f
right join especie e
on f.fnombre = e.efamilia
and f.freino = e.ereino
) on r.rnombre = f.freino
and r.rnombre = e.ereino;
我认为这会做的是:
将家庭和物种作为右连接加入,因此它会带来所有物种,但不会带来没有物种的家庭。所以,如果一个物种没有被归入一个科,它会在科上显示为空。
然后,将结果作为左连接加入王国,因此它会带来每个王国,即使该王国中没有分类的科或物种。
我错了吗?这不应该告诉我那些没有分类的物种吗?如果我进行内部查询,它会带来我想要的。我对事物进行分组有问题吗?
【问题讨论】:
-
这是否与 oracle 所做的查询优化相混淆?在我的查询中,括号是不必要的吗?我得到相同的结果吗? oracle 指令的顺序是什么?
-
@outis 我不得不恭敬地不同意连接语法不会嵌套。 I believe that this article discusses this topic 并得出结论,在连接多个表时,可以使用括号来阐明操作顺序。
-
@MichaelFredrickson:我的立场是正确的。就是这样,SQL/Foundation § 7.6。
标签: sql oracle outer-join