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

Akira Taniguchi akira @ datasource.jp
2003年 9月 2日 (火) 17:56:54 JST


島田さんへ

UNIX(Linux)環境でしたら、以下のようにSQLのテストが手軽に出来ますよ!

vi などで test.sql(例として) に SQL を書き込む。
psql -U userid database -f test.sql として SQL をテスト。


このクエリのポイントは、fk_table を number 別に分解する(見せかける)点です。

> サイミです。
>
> そっか、外部結合を使って
>
> SELECT m.name AS name,
>        j1.yuubin1 AS yuubin1, j1.text1 AS text1,
>        j2.yuubin2 AS yuubin2, j2.text2 AS text2,
>        j3.yuubin3 AS yuubin3, j3.text3 AS text3
> FROM   master m
> LEFT OUTER JOIN (
>     SELECT fk_table.fk_master AS master,
>            location.yuubin    AS yuubin1,
>            fk_table.text      AS text1
>     FROM fk_table, location
>     WHERE fk_table.number = 1
>       AND fk_table.location = location.id) AS j1
>   ON m.id = j1.master
> LEFT OUTER JOIN (
>     SELECT fk_table.fk_master AS master,
>            location.yuubin    AS yuubin2,
>            fk_table.text      AS text2
>     FROM fk_table, location
>     WHERE fk_table.number = 2
>       AND fk_table.location = location.id) AS j2
>   ON m.id = j2.master
> LEFT OUTER JOIN (
>     SELECT fk_table.fk_master AS master,
>            location.yuubin    AS yuubin3,
>            fk_table.text      AS text3
>     FROM fk_table, location
>     WHERE fk_table.number = 3
>       AND fk_table.location = location.id) AS j3
>   ON m.id = j3.master
> ORDER BY m.name;
>
> でいいのかな?

テスト無しでここまで書けるとは、素晴らしいですね。
わかりやすいし、ポイントつかんでますね。
サブクエリも外部結合にしたほうが実践的(エラーデータも表示する)です。

サブクエリ外部結合 & デバッグ

SELECT m.name AS name,
       j1.yuubin1 AS yuubin1, j1.text1 AS text1,
       j2.yuubin2 AS yuubin2, j2.text2 AS text2,
       j3.yuubin3 AS yuubin3, j3.text3 AS text3
FROM   master m
LEFT OUTER JOIN (
    SELECT fk_table.fk_master AS master,
           location.yuubin    AS yuubin1,
           fk_table.text      AS text1
    FROM fk_table
    LEFT OUTER JOIN location
    ON fk_table.fk_location = location.id
    WHERE fk_table.number = 1
    ) AS j1
    ON m.id = j1.master
LEFT OUTER JOIN (
    SELECT fk_table.fk_master AS master,
           location.yuubin    AS yuubin2,
           fk_table.text      AS text2
    FROM fk_table
    LEFT OUTER JOIN location
    ON fk_table.fk_location = location.id
    WHERE fk_table.number = 2
    ) AS j2
    ON m.id = j2.master
LEFT OUTER JOIN (
    SELECT fk_table.fk_master AS master,
           location.yuubin    AS yuubin3,
           fk_table.text      AS text3
    FROM fk_table
    LEFT OUTER JOIN location
    ON fk_table.fk_location = location.id
    WHERE fk_table.number = 3
    ) AS j3
    ON m.id = j3.master
ORDER BY m.name;

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




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