[pgsql-jp: 33348] Re: 重複しているサブクエリーの省略

Akinori FUJII showten24 @ yahoo.co.jp
2004年 6月 23日 (水) 13:10:04 JST


藤井と申します。

質問の内容がPostgreSQLというよりはSQL文についてなのかなと思いながら回答して
います。

hogeテーブルのPRIMARY KEYをご説明いただいていないので2通り考えました。
以下のようなSQLになるのではないでしょうか。

hogeテーブルの制約に「PRIMARY KEY ( d1, d2, name )」があるなら、
    SELECT
        d1,
        d2,
        name,
        max(d3)
    FROM
        hoge
    WHERE
        d2!=3
    GROUP BY
        d1,
        d2,
        name
;

hogeテーブルの制約に「PRIMARY KEY ( d1, d2, name )」がないなら、
SELECT
    hoge.d1,
    hoge.d2,
    hoge.name,
    hoge.d3
FROM
    hoge, 
    (
        SELECT
            name,
            max(d3)
        FROM
            hoge
        WHERE
            d2!=3
        GROUP BY
            name
    ) AS max_hoge
WHERE
    hoge.name = max_hoge.name
    AND hoge.d3 = max_hoge.d3
;

#「PRIMARY KEY ( d1, d2, name )」は「UNIQUE  ( d1, d2, name )」でも構いませ
ん。
 もしhogeテーブルにこのような正規化がなされていないなら、渡辺さんのSQLにム
ダはないように思います。


--- Watanabe Takehiro <takk @ ntt-it.co.jp> からのメッセージ:
> select d1,d2,name,d3 from hoge where d2!=3 の結果
> d1 d2 name d3
> 1  1  P1   10
> 1  2  P1   13
> 2  1  P1   12
> 2  2  P1   13
> 3  1  P2   13
> 3  2  P2   21
> 4  1  P2   23
> 4  2  P2   23
> 
> 最終的に欲しい結果
> d1 d2 name d3
> 1  2  P1   13
> 2  2  P1   13
> 4  1  P2   23
> 4  2  P2   23
> 




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