1つのテーブルの特定の1列を複数列にJOINさせる方法は?
次のような2つのテーブルがあります。(SQL Server 2012)
●ryoko_data(旅行データ)
(旅行NO) (出発地ID) (目的地ID)
ryoko_no(int) syuppatuti_id(nvarchar) mokutekiti_id(nvarchar)
1 1 2
2 3 1
3 2 1
4 1 3
5 2 3
●ini_file_tekina_table (この問題に出会ったときの対象のテーブルがEAVだったので、このテーブルがEAVであることをご了承ください)
category(nvarchar) section(nvarchar) item(nvarchar)
ユーザー名 3 一郎
ユーザー名 2 花子
ユーザー名 1 太郎
地名 2 大阪
地名 1 東京
地名 3 名古屋
次のような結果を出すことが今回の目的です。
ryoko_no syuppatuti_id 出発地 mokutekiti_id 目的地
1 1 東京 2 大阪
2 3 名古屋 1 東京
3 2 大阪 1 東京
4 1 東京 3 名古屋
5 2 大阪 3 名古屋
以下のSQL文を流すと、次のようになります。
(このSQL文をXとします)
select ryoko_no, syuppatuti_id, item, mokutekiti_id from ryoko_data r
left join ini_file_tekina_table i on r.syuppatuti_id = i.section where category = '地名'
order by ryoko_no
ryoko_no syuppatuti_id item mokutekiti_id
1 1 東京 2
2 3 名古屋 1
3 2 大阪 1
4 1 東京 3
5 2 大阪 3
ここで、目的地も地名を出したいので、以下のSQL文を流したところ、次のようになりました。
select ryoko_no,
syuppatuti_id,
item 出発地,
mokutekiti_id,
(select item from ini_file_tekina_table where section=mokutekiti_id and category='地名') 目的地
from ryoko_data r
left join ini_file_tekina_table i on r.syuppatuti_id = i.section where category='地名'
order by ryoko_no
ryoko_no syuppatuti_id 出発地 mokutekiti_id 目的地
1 1 東京 2 大阪
2 3 名古屋 1 東京
3 2 大阪 1 東京
4 1 東京 3 名古屋
5 2 大阪 3 名古屋
最初はLEFT JOIN又はONを複数利用してどうにかできないかと思いましたが、私にはできませんでした(思いついたもののエラーになったSQL文を一番下にZとして示します)ので、上のSQL文のようになりました。
ここで、もしかしたら副問合せを使えばLEFT JOINを使わずにできるのではないかと考え、以下のSQL文を流したところ、次のようになりました。同じ結果です。
(このSQL文をYとします)
select ryoko_no,
syuppatuti_id,
(select item from ini_file_tekina_table where section=syuppatuti_id and category='地名') 出発地,
mokutekiti_id,
(select item from ini_file_tekina_table where section=mokutekiti_id and category='地名') 目的地
from ryoko_data r
order by ryoko_no
ryoko_no syuppatuti_id 出発地 mokutekiti_id 目的地
1 1 東京 2 大阪
2 3 名古屋 1 東京
3 2 大阪 1 東京
4 1 東京 3 名古屋
5 2 大阪 3 名古屋
ここで質問なのですが、Yによる結果をJOINを使って(副問合せを用いずに、Xを発展させる形で)出せますか?
エラーになったSQL文 Z
select ryoko_no,
syuppatuti_id,
item,
mokutekiti_id,
i2.item
(select item from ini_file_tekina_table where section=mokutekiti_id and category='地名')
from ryoko_data r
left join ini_file_tekina_table i on r.syuppatuti_id = i.section where category='地名'
left join ini_file_tekina_table i2 on r.mokutekiti_id = i.section where category='地名'
order by ryoko_no