PostgreSQL과 MySQL의 GROUP BY 문의 차이점
소개
MySQL에서 PostgreSQL로 쿼리를 마이그레이션할 때 GROUP BY 절을 사용할 때 오류가 자주 발생합니다. 이 기사에서는 MySQL과 PostgreSQL의 GROUP BY 간의 차이점을 살펴보고 이 오류를 해결하는 방법을 제공합니다.
오류
PostgreSQL에서 다음 쿼리를 실행하는 경우:
<code class="language-sql">SELECT `availables`.* FROM `availables` INNER JOIN `rooms` ON `rooms`.id = `availables`.room_id WHERE (rooms.hotel_id = 5056 AND availables.bookdate BETWEEN '2009-11-22' AND '2009-11-24') GROUP BY availables.bookdate ORDER BY availables.updated_at</code>
PostgreSQL은 다음 오류를 반환할 수 있습니다.
<code>ERROR: column "availables.id" must appear in the GROUP BY clause or be used in an aggregate function</code>
차이
MySQL에서 GROUP BY 절을 사용하면 집계되지 않은 특정 필드를 쿼리 결과에 포함할 수 있습니다. 그러나 PostgreSQL은 SQL 표준을 따르며 집계되지 않은 모든 필드는 GROUP BY 절에 나타나거나 집계 함수에 사용되어야 합니다.
해결책: DISTINCT ON
PostgreSQL에서 MySQL의 GROUP BY 동작을 시뮬레이션하려면 DISTINCT ON 표현식을 사용할 수 있습니다. DISTINCT ON을 사용하면 지정된 열을 기반으로 그룹당 고유한 행을 선택할 수 있습니다. 주어진 예에서 다음 쿼리는 PostgreSQL에서 작동합니다.
<code class="language-sql">SELECT DISTINCT ON (availables.bookdate) `availables`.* FROM `availables` INNER JOIN `rooms` ON `rooms`.id = `availables`.room_id WHERE (rooms.hotel_id = 5056 AND availables.bookdate BETWEEN '2009-11-22' AND '2009-11-24') ORDER BY availables.bookdate, availables.updated_at</code>
이 쿼리는 availables.bookdate의 각 고유 값에 대해 번째 행을 반환하여 MySQL의 GROUP BY 동작을 효과적으로 시뮬레이션합니다. 일관된 결과를 보장하기 위해 availables.updated_at
절에 ORDER BY
을 추가하여 DISTINCT ON
가 항상 동일한 행을 선택하도록 했습니다. 이것이 없으면 DISTINCT ON
는 실행될 때마다 다른 행을 반환할 수 있습니다.
위 내용은 MySQL GROUP BY 쿼리를 PostgreSQL로 올바르게 마이그레이션하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!