집 >데이터 베이스 >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
행을 선택하기 때문입니다.
두 가지 효과적인 해결 방법은 다음과 같습니다.
방법 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!