質問: sqlのこと:distinctして並び替えたい select * from (select distinct on (aaa) * from bbb) as ccc order by ddd テーブルbbbのaaaというフィールドが重複せず、しかも他のフィールドで並び替えをしたかったら、このような書き方以外ありますか?データベースはpostgresqlです。 この書き方で不都合が出ているというわけではありませんが、どう書けば、パフォーマンス的にも良いsqlになるか、詳しい方がいらっしゃいましたら、お願いします。
回答: >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の方が移植性高そうだし)