ホームページ >データベース >mysql チュートリアル >PostgreSQL で MySQL GROUP BY クエリが失敗するのはなぜですか?
PostgreSQL と MySQL: GROUP BY 句の比較
MySQL クエリを PostgreSQL に移行すると、「列 'XYZ' は GROUP BY 句に表示されるか、集計関数で使用される必要があります。」というエラーが発生する可能性があります。この矛盾は、これらのデータベースが GROUP BY
句を処理する方法に起因します。
MySQL の非標準的なアプローチ
MySQL の GROUP BY
実装は SQL 標準から逸脱しています。 GROUP BY
句に明示的にリストされていない列を選択できるため、予測できない出力が発生します。 各グループから選択された行は、インデックス作成やクエリの最適化などの要素の影響を受けて、暗黙的に決定されます。
PostgreSQL の標準準拠 GROUP BY
しかし、PostgreSQL は SQL 標準に厳密に従っています。 SELECT
リスト内のすべての列は、GROUP BY
句に含めるか、集計関数 (SUM
、AVG
、COUNT
など) の一部である必要があります。 そうしないと、前述のエラーが発生します。
PostgreSQL での MySQL の動作の複製
PostgreSQL のアプローチはより予測可能で標準に準拠していますが、DISTINCT ON
を使用して MySQL の非標準的な動作をシミュレートできます。次の PostgreSQL クエリはこれを示しています:
<code class="language-sql">SELECT DISTINCT ON (availables.bookdate) availables.*, rooms.hotel_id FROM availables INNER JOIN rooms ON rooms.id = availables.room_id WHERE rooms.hotel_id = 5056 AND availables.bookdate BETWEEN '2009-11-22' AND '2009-11-24' ORDER BY availables.updated_at;</code>
DISTINCT ON
は、availables.bookdate
句で指定された行の順序を維持しながら、ORDER BY
内の個別の値ごとに 1 つの行を返します。 これは、この特定のシナリオにおける MySQL の非標準 GROUP BY
動作を効果的に模倣します。 このアプローチは、ORDER BY
句に依存して、個別のグループごとにどの行が選択されるかを定義することに注意してください。
以上がPostgreSQL で MySQL GROUP BY クエリが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。