プロが教えるわが家の防犯対策術!

select * from (select distinct on (aaa) * from bbb) as ccc order by ddd


テーブルbbbのaaaというフィールドが重複せず、しかも他のフィールドで並び替えをしたかったら、このような書き方以外ありますか?データベースはPostgreSQLです。

この書き方で不都合が出ているというわけではありませんが、どう書けば、パフォーマンス的にも良いSQLになるか、詳しい方がいらっしゃいましたら、お願いします。

A 回答 (2件)

>今回の場合、かまわないという状況


だとすると以下のSQLで問題ないんじゃないでしょうか?

>select * from (select distinct on (aaa) * from bbb) as ccc order by ddd

基本的にdistinctを置き換えるのはgroup byだと思いますが、この場合group byでは面倒なので、distinctで良いと思います。
(再帰結合とかすればいけそうな気もするけど、できても多分すげーめんどいと思う)
    • good
    • 0
この回答へのお礼

5ヶ月間があいてしまいました。
すみません。
おかげさまで、「とりあえず これでいっか」と思えました(^-^;
PostgreSQLとMySQLを触る機会がありまして、いろいろ勉強していた時期でした。
ありがとうございました。

お礼日時:2005/08/26 01:15

>select * from (select distinct on (aaa) * from bbb) as ccc order by ddd



distinctってほとんど使わんのであれですが、このSQLだと以下のような場合結果が不定になりませんか?
(aaaが重複している場合、from内のselectでdddの2が返るか、3が返るか特定できない)
http://www.postgresql.jp/document/pg800doc/html/ …
aaa ddd
1 2
1 3
#普通にこんな感じでOKらしいです。
#select distinct on (aaa) * from bbb order by ddd

>パフォーマンス的にも良いSQL
PostgreSQLのdistinctはそんなによくないようです。
(Oracleとかだと早いらしいですが)
http://www2b.biglobe.ne.jp/~caco/fourth_edition/ …

Group By (*)ができないので、*がほしいならdistinctの方がいいかもしれませんが、それ以外ならGroup Byの方がいいかも。
(Group Byの方が移植性高そうだし)

この回答への補足

レスありがとうございます。

> (aaaが重複している場合、from内のselectでdddの2が返るか、3が返るか特定できない)

は、実は今回の場合、かまわないという状況です。

なぜ困っているかといいますと、postgresでは、

select distinct on (aaa) * from bbb order by aaa, ddd

このように書かねばならないようです。
distinct on (~)で指定したフィールドが、order by の最初に現れないといけないと。
つまり、aaa順になるので、並び替えたくても並び変わらないんです (--;

補足日時:2005/03/28 12:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!