sql >> データベース >  >> RDS >> PostgreSQL

スコープでフィールドを拡張するレール、PGはそれを好きではありません

    フランクが説明したように、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は最適ではありません。それらの左外部結合の多くは、内部結合である必要があるように見えます。これにより、プランナーは必要に応じて適切な参加順序を選択できるようになります。



    1. MySQLBLOBコンテンツをjson応答として送信する

    2. TSQLで分数をhh:mm形式に変換するにはどうすればよいですか?

    3. 1つのテーブルを多数のテーブルに接続する

    4. 修正:MariaDBの「information_schemaの不明なテーブル「ロケール」」