人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【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

●質問者: Kenju
●カテゴリ:コンピュータ
✍キーワード:SQL すみません コード データ 名称
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● fangoln
●20ポイント

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


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のところとか。

◎質問者からの返答

ありがとうございます。


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

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

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


2 ● AketiJyuuzou
●80ポイント ベストアンサー

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;

◎質問者からの返答

ありがとうございます。

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


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

101|202|304|まみむ

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ