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

簡単な英語で私が探しているのは、null 値を保持しながら、すべての既知の猫 + 関連する猫のソース + 猫のステータスを返すことです。私が持っている唯一の情報は、私が興味を持っている情報源です。また、ステータスが STRAY または UNKNOWN (null) の猫のみが必要です。

アップデート

明確にするために、Cats のマッピングは次のようになります。

Cat の ID は、列 catId の下の Source テーブルに格納されます。
Status テーブルには、catSource というラベルの付いた列として Source の PK への参照があります。

実際には、現在の猫のステータスを取得するためのクエリは次のようになります。

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

期待されるデータは少しずれているようです。このクエリを確認してください (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 に答える
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 に答える