フランクが説明したように、PostgreSQLは再現可能な行のセットを返さないクエリを拒否します。
次のようなクエリがあるとします。
select a, b, agg(c)
from tbl
group by a
b
のため、PostgreSQLはそれを拒否します group by
では指定されていません 声明。対照的に、MySQLで実行すると、受け入れられます。ただし、後者の場合、いくつかの挿入、更新、および削除が実行され、ディスクページの行の順序が異なります。
メモリが機能する場合、実装の詳細は、MySQLが実際にa、bでソートし、セットの最初のbを返すようになっています。しかし、SQL標準に関する限り、動作は指定されていません。確かに、PostgreSQLはしません。 集計関数を実行する前に必ず並べ替えてください。
潜在的に、これによりb
の値が異なる可能性があります PostgreSQLの結果セット。したがって、具体的でない限り、PostgreSQLはエラーを生成します:
select a, b, agg(c)
from tbl
group by a, b
フランクが強調したのは、PostgreSQL 9.1では、a
b
を残すことができるよりも主キーです 指定なし-該当する主キーが一意の行を意味する場合、プランナーは後続のgroupbyフィールドを無視するように指示されています。
特に問題については、現在のように plusでグループを指定する必要があります。 集計のベースとなるすべてのフィールド、つまり"widgets"."id", "widgets"."user_id", [snip]
ただし、sum(amount)
のようなものではありません 、これは集計関数呼び出しです。
トピック外の補足として、ORM /モデルがどのように機能するかはわかりませんが、生成されるSQLは最適ではありません。それらの左外部結合の多くは、内部結合である必要があるように見えます。これにより、プランナーは必要に応じて適切な参加順序を選択できるようになります。