ホームページ >データベース >mysql チュートリアル >PostgreSQL の「SELECT DISTINCT ON 式は最初の ORDER BY 式と一致する必要があります」エラーを解決する方法?
PostgreSQL DISTINCT ON
エラー: ORDER BY
句が一致しません
異なる式を含む DISTINCT ON
句で PostgreSQL の ORDER BY
を使用すると、「SELECT DISTINCT ON 式は最初の ORDER BY 式と一致する必要があります。」というエラーが発生する可能性があります。 これは、DISTINCT ON
が指定された列に基づいて一意の行を選択するのに対し、ORDER BY
はそれらの一意の行の表示順序を決定するために発生します。 したがって、DISTINCT ON
内の列は、ORDER BY
句の先頭の列と一致する必要があります。
たとえば、最新の address_id
タイムスタンプを持つ行に優先順位を付けながら個別の purchased_at
値を取得する必要がある場合、address_id
を使用する場合、ORDER BY
句の DISTINCT ON (address_id)
で並べ替えるだけでは十分ではありません。 これは、DISTINCT ON
が 句に従って、遭遇した ごとに address_id
最初のORDER BY
行を選択するためです。
ここでは 2 つの効果的な回避策を示します:
方法 1: 最大 purchased_at
このアプローチでは、サブクエリを使用して各 purchased_at
の最大 address_id
を検索し、この結果を元のテーブルに結合して対応する行を選択します。
<code class="language-sql">SELECT t1.* FROM purchases t1 JOIN ( SELECT address_id, MAX(purchased_at) AS max_purchased_at FROM purchases WHERE product_id = 1 GROUP BY address_id ) t2 ON t1.address_id = t2.address_id AND t1.purchased_at = t2.max_purchased_at ORDER BY t1.purchased_at DESC;</code>
方法 2: DISTINCT ON
と ORDER BY
この PostgreSQL 固有のソリューションは、ネストされたクエリを使用します。内部クエリは DISTINCT ON
を使用して目的の一意の行を選択し、適切な順序で並べ、外部クエリは結果を並べ替えます。
<code class="language-sql">SELECT * FROM ( SELECT DISTINCT ON (address_id) * FROM purchases WHERE product_id = 1 ORDER BY address_id, purchased_at DESC ) t ORDER BY purchased_at DESC;</code>
どちらの方法でも、DISTINCT ON
句と一致しない ORDER BY
句を直接組み合わせることで課せられる制限を克服し、効率的で正確な結果が得られます。 コーディング スタイルとデータベースのパフォーマンス要件に最も適した方法を選択してください。
以上がPostgreSQL の「SELECT DISTINCT ON 式は最初の ORDER BY 式と一致する必要があります」エラーを解決する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。