[pgsql-jp: 30908] Re: レコード内容から列名を取得・生成?するSQL
斎見 浩平
saimi_at_qs @ ybb.ne.jp
2003年 9月 2日 (火) 16:37:39 JST
サイミです。
SELECT m.id,
f1.id AS id1, f1.number AS n1,
f2.id AS id2, f1.number AS n2,
f3.id AS id3, f1.number AS n3
FROM master m, fk_table f1, fk_table f2, fk_table f3
WHERE m.id = f1.fk_master
AND m.id = f2.fk_master
AND m.id = f3.fk_master
ORDER BY m.id, f1.id, f2.id, f3.id
とやると、
---------------------------
m1 1 1 1 1 1 1
m1 1 1 1 1 2 2
m1 1 1 1 1 3 3
m1 1 1 2 2 1 1
m1 1 1 2 2 2 2
m1 1 1 2 2 3 3
...
m3 9 3 9 3 8 2
m3 9 3 9 3 9 3
のようになるはずですね。
そこで、条件をちょっと追加。
SELECT m.id,
f1.id AS id1, f1.number AS n1,
f2.id AS id2, f1.number AS n2,
f3.id AS id3, f1.number AS n3
FROM master m, fk_table f1, fk_table f2, fk_table f3
WHERE m.id = f1.fk_master
AND m.id = f2.fk_master
AND m.id = f3.fk_master
AND f1.number = 1
AND f2.number = 2
AND f3.number = 3
ORDER BY m.id, f1.id, f2.id, f3.id
---------------------------
m1 1 1 2 2 3 3
m2 4 1 5 2 6 3
m3 7 1 8 2 9 3
ここまできました。
では、期待の結果を得るには、
SELECT m.name AS name,
l1.yuubin AS yuubin1, f1.text AS text1,
l2.yuubin AS yuubin2, f1.text AS text2,
l3.yuubin AS yuubin3, f1.text AS text3,
FROM master m,
location l1, fk_table f1,
location l2, fk_table f2,
location l3, fk_table f3
WHERE m.id = f1.fk_master
AND m.id = f2.fk_master
AND m.id = f3.fk_master
AND f1.fk_location = l1.id
AND f2.fk_location = l2.id
AND f3.fk_location = l3.id
AND f1.number = 1
AND f2.number = 2
AND f3.number = 3
ORDER BY m.name
で期待の結果が出ると思います
が、問題がひとつ。
例のデータのように各masterに対し、numberが1の行、2, 3の行と全て
fk_tableに存在していればいいのですが、なにか足りない場合、空白
のフィールドが出来るのではなく、その行自体が出力されなくなります。
例えば、fk_tableのid=8の行が欠落しているとき、結果の第3行を
C, 777-7777, ito1, (null), (null), 999-9999, ito3
と出力するためには、かなり手の込んだことをする必要がありそうです。
直感的に思いつかないので、別の人に譲ります。
--
斎見 浩平 <saimi_at_qs @ ybb.ne.jp>
pgsql-jp メーリングリストの案内