Rog*_*ger 5 sql oracle outer-join
我正在尝试学习ansi-92 SQL标准,但我似乎并不完全理解它(我对ansi-89标准以及一般的数据库都是新手).
在我的例子中,我有三个表王国 - <family - <species(生物分类).
为什么会这样?
说一个生物学家,找到一个新的物种,但他没有把它分类为一个王国或一个家庭,创造一个没有物种的新家庭,并不确定它应属于哪个王国,等等.
这是一个小提琴(参见最后一个查询):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;
Run Code Online (Sandbox Code Playgroud)
我认为这会做的是:
加入家庭和物种作为正确的联合,所以它带来了每个物种,但不是那些没有物种的家庭.因此,如果一个物种没有被归类为一个家庭,它将在家庭中出现无效.
然后,加入王国,结果作为左联盟,所以它带来了每个王国,即使没有归类于该王国的家庭或物种.
我错了吗?这不应该告诉我那些尚未归类的物种吗?如果我做内部查询它会带来我想要的东西.我在分组的东西有问题吗?
您对#1 的描述是正确的...您的查询问题出在步骤#2 上。
当您执行left join从王国到(家族和物种)的操作时,您会请求每个王国,即使没有匹配的(家族和物种)......但是,这不会返回任何不匹配的(家族和物种)组合。没有一个匹配的王国。
更接近的查询是:
select *
from reino r
full 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;
Run Code Online (Sandbox Code Playgroud)
请注意,已left join替换为full join...
但是,这只返回与某个物种相关的家族...它不会返回与王国相关但与物种无关的任何家族。
重新阅读你的问题后,这实际上是你想要的......
编辑:经过进一步思考,您可以像这样重写查询:
select *
from
especie e
left join familia f
on f.fnombre = e.efamilia
and f.freino = e.ereino
full join reino r
on r.rnombre = f.freino
and r.rnombre = e.ereino;
Run Code Online (Sandbox Code Playgroud)
我认为这是更好的选择,因为您消除了RIGHT JOIN通常因风格不佳而令人皱眉的 和括号,这对于人们正确解析以确定结果是什么来说可能很棘手。
| 归档时间: |
|
| 查看次数: |
195 次 |
| 最近记录: |