PostgreSQL LEFT JOIN 및 0 개수 누락
PostgreSQL의 LEFT JOIN
은 오른쪽 테이블에 일치하는 항목이 없더라도 왼쪽 테이블의 모든 행을 반환하도록 설계되었습니다. 그러나 부적절하게 배치된 WHERE
절 조건은 LEFT JOIN
을 INNER JOIN
으로 효과적으로 변환하여 개수가 0인 행을 생략할 수 있습니다.
이 문제는 WHERE
절에 올바른 테이블을 기준으로 한 필터링 조건을 배치할 때 자주 발생합니다. 다음 예를 고려해보세요:
<code class="language-sql">SELECT o.name AS organisation_name, COALESCE(COUNT(exam_items.id)) AS total_used FROM organisations o LEFT JOIN exam_items e ON o.id = e.organisation_id WHERE e.item_template_id = #{sanitize(item_template_id)} AND e.used = true GROUP BY o.name ORDER BY o.name</code>
WHERE
절은 특정 exam_items
및 item_template_id
에 대해 used = true
을 필터링합니다. 이는 조인 이후를 필터링하여 organisations
에서 이러한 조건을 만족하는 일치하는 행이 없는 행을 exam_items
에서 제거합니다.
해결책: 필터링을 JOIN 조건으로 재배치
organisations
의 모든 행을 유지하려면 exam_items
에서 일치하는 행이 없더라도 필터링 조건을 WHERE
절에서 JOIN
절로 이동하세요.
<code class="language-sql">SELECT o.name AS organisation_name, COUNT(e.id) AS total_used FROM organisations o LEFT JOIN exam_items e ON e.organisation_id = o.id AND e.item_template_id = #{sanitize(item_template_id)} AND e.used = true GROUP BY o.name ORDER BY o.name</code>
이제 필터링은 조인 중에 발생합니다. 기준을 충족하는 exam_items
행만 조인 대상으로 간주됩니다. 일치하는 행이 없는 organisations
행은 계속 포함되므로 total_used
값은 0이 됩니다.
추가 최적화: COUNT() 및 COALESCE
원래 쿼리에서는 COALESCE(COUNT(exam_items.id))
을 사용합니다. 이것은 중복됩니다. COUNT()
반환되지 않음 NULL
; 일치하는 행이 없으면 0을 반환합니다. 따라서 COALESCE
은 불필요하며 쿼리 효율성 향상을 위해 제거할 수 있습니다.
위 내용은 내 PostgreSQL LEFT JOIN이 개수가 0인 행을 반환하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!