ホームページ >データベース >mysql チュートリアル >PostgreSQL の「SELECT DISTINCT ON 式は最初の ORDER BY 式と一致する必要があります」エラーを解決する方法?

PostgreSQL の「SELECT DISTINCT ON 式は最初の ORDER BY 式と一致する必要があります」エラーを解決する方法?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-21 12:17:09259ブラウズ

How to Resolve PostgreSQL's

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

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