- ベストアンサー
SQLのこと:distinctして並び替えたい
select * from (select distinct on (aaa) * from bbb) as ccc order by ddd テーブルbbbのaaaというフィールドが重複せず、しかも他のフィールドで並び替えをしたかったら、このような書き方以外ありますか?データベースはPostgreSQLです。 この書き方で不都合が出ているというわけではありませんが、どう書けば、パフォーマンス的にも良いSQLになるか、詳しい方がいらっしゃいましたら、お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>今回の場合、かまわないという状況 だとすると以下のSQLで問題ないんじゃないでしょうか? >select * from (select distinct on (aaa) * from bbb) as ccc order by ddd 基本的にdistinctを置き換えるのはgroup byだと思いますが、この場合group byでは面倒なので、distinctで良いと思います。 (再帰結合とかすればいけそうな気もするけど、できても多分すげーめんどいと思う)
その他の回答 (1)
- zebedeer
- ベストアンサー率66% (80/121)
>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/tutorial-select.html#FTN.AEN748 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/tuning.html 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順になるので、並び替えたくても並び変わらないんです (--;
お礼
5ヶ月間があいてしまいました。 すみません。 おかげさまで、「とりあえず これでいっか」と思えました(^-^; PostgreSQLとMySQLを触る機会がありまして、いろいろ勉強していた時期でした。 ありがとうございました。