[pgsql-jp: 30906] Re: レコード内容から列名を取得・生成?するSQL

Akira Taniguchi akira @ datasource.jp
2003年 9月 2日 (火) 15:41:50 JST


谷口と申します。

まず、マスタに対するレコード件数が固定(サンプルでは3件)として考えましょう。

(1) 以下のSQLはどうでしょうか?



select m.name
, l1.yuubin as yuubin1, f1.text as text1
, l2.yuubin as yuubin2, f2.text as text2
, l3.yuubin as yuubin3, f3.text as text3
from master as m
left outer join fk_table as f1 on (f1.fk_master = m.id)
left outer join location as l1 on (l1.id = f1.fk_location)
left outer join fk_table as f2 on (f2.fk_master = m.id)
left outer join location as l2 on (l2.id = f2.fk_location)
left outer join fk_table as f3 on (f3.fk_master = m.id)
left outer join location as l3 on (l3.id = f3.fk_location)
where (f1.number = 1) and (f2.number = 2) and (f3.number = 3)
order by m.id;

(2) または、VIEW を定義します。

create view fk_1(fk_master, yuubin1, text1) as
select f.fk_master, l.yuubin, f.text
from fk_table as f
left outer join location as l on (l.id = f.fk_location)
where (f.number = 1);

create view fk_2(fk_master, yuubin2, text2) as
select f.fk_master, l.yuubin, f.text
from fk_table as f
left outer join location as l on (l.id = f.fk_location)
where (f.number = 2);

create view fk_3(fk_master, yuubin3, text3) as
select f.fk_master, l.yuubin, f.text
from fk_table as f
left outer join location as l on (l.id = f.fk_location)
where (f.number = 3);

select name, yuubin1, text1, yuubin2, text2, yuubin3, text3
from master as m
left outer join fk_1 as f1 on (f1.fk_master = m.id)
left outer join fk_2 as f2 on (f2.fk_master = m.id)
left outer join fk_3 as f3 on (f3.fk_master = m.id)
order by m.id;

つぎに、マスタに対するレコード件数が不定として考えましょう。
この場合カラムの名前は自動的に定義できません。
以下のSQLで最大件数を検索します。

select max(number) from fk_table;

この最大件数をもとに、(1)同様にSQLを作成するしかないと思います。

島田さんの環境はわからないのですが、
VIEWとして登録しておき、
ODBCドライバ経由で直接 Excel に取り込むのが簡単だと思います。
Apache + PHP が使用可能であれば、
データ表示用のページを作成し、
ブラウザから Excel にテーブルをコピーするのが簡単かと思います。
この場合、PHPスクリプト内で自動的にSQLを作成するのは簡単でしょう。

------------------------------
 Akira Taniguchi (DataSource) 
 akira @ datasource.jp
 http://www.datasource.jp




pgsql-jp メーリングリストの案内