> 데이터 베이스 > MySQL 튜토리얼 > PostgreSQL의 'SELECT DISTINCT ON 표현식은 초기 ORDER BY 표현식과 일치해야 합니다' 오류를 해결하는 방법은 무엇입니까?

PostgreSQL의 'SELECT DISTINCT ON 표현식은 초기 ORDER BY 표현식과 일치해야 합니다' 오류를 해결하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2025-01-21 12:17:09
원래의
318명이 탐색했습니다.

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 행을 선택하기 때문입니다.

두 가지 효과적인 해결 방법은 다음과 같습니다.

방법 1: 최대 하위 쿼리 purchased_at

이 접근 방식은 하위 쿼리를 사용하여 각 purchased_at에 대한 최대 address_id를 찾은 다음 이 결과를 원래 테이블에 다시 조인하여 해당 행을 선택합니다.

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;
로그인 후 복사

방법 2: DISTINCT ONORDER BY

을 사용한 중첩 쿼리

이 PostgreSQL 전용 솔루션은 중첩 쿼리를 사용합니다. 내부 쿼리는 DISTINCT ON을 사용하여 원하는 고유 행을 선택하고 적절하게 정렬하며 외부 쿼리는 결과를 다시 정렬합니다.

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;
로그인 후 복사

두 가지 방법 모두 DISTINCT ON 절과 불일치 ORDER BY 절을 직접 결합하여 발생하는 한계를 극복하여 효율적이고 정확한 결과를 제공합니다. 코딩 스타일과 데이터베이스 성능 요구 사항에 가장 적합한 방법을 선택하세요.

위 내용은 PostgreSQL의 'SELECT DISTINCT ON 표현식은 초기 ORDER BY 표현식과 일치해야 합니다' 오류를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿