ホームページ >データベース >mysql チュートリアル >PostgreSQL で MySQL GROUP BY クエリが失敗するのはなぜですか?

PostgreSQL で MySQL GROUP BY クエリが失敗するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-11 07:36:43161ブラウズ

Why Does My MySQL GROUP BY Query Fail in PostgreSQL?

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 句に含めるか、集計関数 (SUMAVGCOUNT など) の一部である必要があります。 そうしないと、前述のエラーが発生します。

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。