[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 メーリングリストの案内