【SQL】

下記に示す三つのテーブルがあります。
そのとき、結果に示す表示が取得できる簡単なSQLは何になりますか?
見難くなっていてすみません。 | はデータの区切りです。

テーブル1 (キー:コード1
コード1 | 名称
101 | あ
102 | い
103 | う


テーブル2 (キー:コード2
コード1 | コード2 | 名称
90 | 201 | かき
101 | 202 | さし
102 | 203 | たち


テーブル3 (キー:コード3
コード1 | コード2 | コード3 | 名称
null | 201 | 301 | なにぬ
80 | null | 302 | はひふ
null | 202 | 304 | まみむ
null | 204 | 305 | やゆよ


結果
コード1 | 名称 | コード2 | 名称 | コード3 | 名称
null | null | 204 | null | 305 | やゆよ
80 | null | null | null | 302 | はひふ
90 | null | 201 | かき | 301 | なにぬ
101 | あ | 202 | さし | 304 | まみむ
102 | い | 203 | たち | null | null
103 | う | null | null | null | null

回答の条件
  • 1人2回まで
  • 登録:2006/10/20 14:52:16
  • 終了:2006/10/25 17:21:01

ベストアンサー

id:AketiJyuuzou No.2

AketiJyuuzou回答回数5ベストアンサー獲得回数32006/10/25 13:13:06

ポイント80pt

Oracle9iで作ってみました

with テーブル1 as(select 101 as コード1,'あ' as 名称 from dual

union select 102 as コード1,'い' as 名称 from dual

union select 103 as コード1,'う' as 名称 from dual),

テーブル2 as (select 90 as コード1,201 as コード2,'かき' as 名称 from dual

union select 101,202,'さし' from dual

union select 102,203,'たち' from dual),

テーブル3 as (select null as コード1,201 as コード2,301 as コード3,'なにぬ' as 名称 from dual

union select 80,null,302,'はひふ' from dual

union select null,202,304,'まみむ' from dual

union select null,204,305,'やゆよ' from dual)

select coalesce(a.コード1,b.コード1,c.コード1) as コード1 ,

a.名称,

coalesce(b.コード2,c.コード2) as コード2,

b.名称,c.コード3,c.名称

from テーブル1 a full join テーブル2 b

on a.コード1 = b.コード1

full join テーブル3 c

on coalesce(a.コード1,b.コード1) = c.コード1

or b.コード2 = c.コード2

order by コード1 nulls first;

id:Kenju

ありがとうございます。

なるほど、これでいけますね。


テーブル3のコード1には気まぐれに

101|202|304|まみむ

みたいにコードが入ってくるんですが、考えないことにします。w

2006/10/25 17:18:55

その他の回答(1件)

id:fangoln No.1

fangoln回答回数20ベストアンサー獲得回数22006/10/20 16:38:39

ポイント20pt

簡単に、ということでしたが、自分にはこれが精一杯でした。


SELECT  ISNULL(X.A, [テーブル3].[コード1]) AS T, 
        X.B, 
        ISNULL(X.C, [テーブル3].[コード2]) AS U, 
        X.D, [テーブル3].[コード3], 
        名称3
FROM    [テーブル3] FULL OUTER JOIN
             (SELECT  ISNULL([テーブル1].[コード1], [テーブル2].[コード1]) AS A,
                      [テーブル1].[名称1] AS B, 
                      [テーブル2].[コード2] AS C, 
                      [テーブル2].名称2 AS D
              FROM    [テーブル2] FULL OUTER JOIN
                             [テーブル1] 
                      ON [テーブル1].[コード1] = [テーブル2].[コード1]
             ) AS X 
        ON [テーブル3].[コード1] = X.A OR [テーブル3].[コード2] = X.C
ORDER BY  T, X.B

なおこのSQLはMSSQLServer2000での動作確認をしていますが、他のシステムの場合には手直しが必要になると思われます。IsNullのところとか。

id:Kenju

ありがとうございます。


うーん、やっぱりこうなりますか。

ISNULLのところはCOALESCEを使いましたが、概ね同じに・・・。

やはりこれ以上簡単にはなりませんかね。

2006/10/20 16:50:10
id:AketiJyuuzou No.2

AketiJyuuzou回答回数5ベストアンサー獲得回数32006/10/25 13:13:06ここでベストアンサー

ポイント80pt

Oracle9iで作ってみました

with テーブル1 as(select 101 as コード1,'あ' as 名称 from dual

union select 102 as コード1,'い' as 名称 from dual

union select 103 as コード1,'う' as 名称 from dual),

テーブル2 as (select 90 as コード1,201 as コード2,'かき' as 名称 from dual

union select 101,202,'さし' from dual

union select 102,203,'たち' from dual),

テーブル3 as (select null as コード1,201 as コード2,301 as コード3,'なにぬ' as 名称 from dual

union select 80,null,302,'はひふ' from dual

union select null,202,304,'まみむ' from dual

union select null,204,305,'やゆよ' from dual)

select coalesce(a.コード1,b.コード1,c.コード1) as コード1 ,

a.名称,

coalesce(b.コード2,c.コード2) as コード2,

b.名称,c.コード3,c.名称

from テーブル1 a full join テーブル2 b

on a.コード1 = b.コード1

full join テーブル3 c

on coalesce(a.コード1,b.コード1) = c.コード1

or b.コード2 = c.コード2

order by コード1 nulls first;

id:Kenju

ありがとうございます。

なるほど、これでいけますね。


テーブル3のコード1には気まぐれに

101|202|304|まみむ

みたいにコードが入ってくるんですが、考えないことにします。w

2006/10/25 17:18:55

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません