我在 Oracle 中有以下最小架构: http ://sqlfiddle.com/#!4/c1ed0/14
我运行的查询产生了太多结果,这个查询:
select cat.*, status.*, source.*
from cats cat, status status, source source
Left OUTER JOIN source source2
on source2.sourceid = 1
Right OUTER JOIN status status2
on status2.isStray =0
order by cat.name
会产生不正确的结果。我期待的是一个如下所示的表,但是我似乎无法提出正确的 SQL。
NAME AGE LENGTH STATUSID CATSOURCE ISSTRAY SOURCEID CATID
Adam 1 25 null null null 1 2
Bill 5 1 null null null null null
Charles 7 5 null null null null null
Steve 12 15 1 1 1 1 1
用简单的英语,我正在寻找的是返回所有已知的猫 + 它们相关的猫源 + 它们的猫状态,同时保留空值。我将拥有的唯一信息是我很好奇的来源。我也只想要状态为 STRAY 或 UNKNOWN (null) 的猫
更新
为了澄清 Cats 的映射如下所示:
Cat 的 id 存储在 Source 表中 catId 列下。
Status 表引用了 Source 的 PK 作为标记为 catSource 的列。
在实践中,要获取当前猫的状态,查询将是:
select cat.* from cats cat, status status, source source
where cat.id = source.catId
and source.sourceId = status.catSource
最终查询
select *
from source
inner join cats on source.catid = cats.id
and source.sourceid = 1
left join status on source.sourceid = status.catsource