집 >데이터 베이스 >MySQL 튜토리얼 >PostgreSQL에서 'DISTINCT ON 표현식은 초기 ORDER BY 표현식과 일치해야 합니다'를 해결하는 방법은 무엇입니까?
PostgreSQL의 DISTINCT ON
절은 세트 내의 각 고유 값에 대한 첫 번째 행 검색을 단순화합니다. 그러나 DISTINCT ON
표현식이 초기 ORDER BY
표현식과 일치하지 않을 때 일반적인 함정이 발생합니다.
DISTINCT ON
표현 불일치 오류자주 발생하는 오류:
<code class="language-sql">SELECT DISTINCT ON (address_id) purchases.address_id, purchases.* FROM purchases WHERE purchases.product_id = 1 ORDER BY purchases.purchased_at DESC</code>
결과:
<code>PG::Error: ERROR: SELECT DISTINCT ON expressions must match initial ORDER BY expressions</code>
DISTINCT ON
및 ORDER BY
PostgreSQL 문서에서는 DISTINCT ON
표현식이 가장 왼쪽의 ORDER BY
표현식을 미러링해야 한다고 규정합니다. 해결책은 간단합니다. ORDER BY
절을 다시 정렬하세요.
<code class="language-sql">SELECT DISTINCT ON (address_id) purchases.address_id, purchases.* FROM purchases WHERE purchases.product_id = 1 ORDER BY address_id, purchases.purchased_at DESC</code>
address_id
주문address_id
으로 주문하지 않으려면 다음 대안을 고려하세요.
방법 1: "그룹당 가장 위대한 N" 접근법
이 방법은 각 항목에 대한 가장 최근 구매를 효율적으로 찾습니다. 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: PostGreSQL용 중첩 쿼리
이 접근 방식은 하위 쿼리를 사용하여 purchased_at
순서를 유지하면서 원하는 결과를 얻습니다.
<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>
이러한 대안은 최종 출력 순서에서 address_id
우선 순위를 지정하고 싶지 않을 때 유연성을 제공합니다. DISTINCT ON
제약 조건
위 내용은 PostgreSQL에서 'DISTINCT ON 표현식은 초기 ORDER BY 표현식과 일치해야 합니다'를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!