1

我在 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
4

2 回答 2

1
select *
from source
    inner join cats on source.catid = cats.id
    left join status on source.sourceid = status.catsource
         and statusid=1
于 2012-09-07T15:36:32.937 回答
1

预期的数据似乎有点偏离。检查此查询(使用 oracle 语法)。

select c.name,
       c.age,
       c.length,
       s.*,
       src.*
  from cats c,
       status s,
       Source src
  where c.id = s.StatusId(+)
     and c.id = src.sourceId(+)
  order by c.name


Adam    1   25              2   2
Bill    5   1                   
Charles 7   5                   
Steve   12  15  1   1   1   1   2
Steve   12  15  1   1   1   1   1
于 2012-09-07T15:45:43.073 回答