我正在尝试学习ansi-92 SQL标准,但我似乎并没有完全理解它(我对ansi-89标准以及数据库一般都不熟悉)。我误解了联结吗?
在我的例子中,我有三个表王国 - <家族 - <种(生物分类)。
- 有可能是没有物种和家庭的王国。
- 可能有家庭没有物种也没有kindgoms。
- 有可能是没有王国或家庭的物种。
为什么会发生这种情况?
说的生物学家发现一个新物种,但他并没有分为王国或家庭这一点,创建一个新的家族,有没有种,是不知道什么王国它应该属于等
这里是一个小提琴(看最后一个查询):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的命令是什么? – Roger 2012-03-28 05:41:15
@outis我必须恭敬地不同意这种连接语法不能嵌套。 [我相信,这篇文章讨论这个话题(http://tonyhasler.wordpress.com/2009/02/22/parentheses-in-ansi-join-syntax/),并得出结论:可以使用括号明确的顺序连接多个表时的操作。 – 2012-03-28 05:55:05
@MichaelFredrickson:我纠正了。它就是SQL/Foundation§7.6。 – outis 2012-03-28 07:38:41