>데이터 베이스 >MySQL 튜토리얼 >PostgreSQL에서 LEFT JOIN이 0 카운트를 반환하지 않는 이유는 무엇입니까?

PostgreSQL에서 LEFT JOIN이 0 카운트를 반환하지 않는 이유는 무엇입니까?

DDD
DDD원래의
2025-01-14 10:57:44904검색

Why Doesn't My LEFT JOIN Return Zero Counts in PostgreSQL?

PostgreSQL LEFT JOIN: 0 카운트 반환 보장

PostgreSQL LEFT JOIN의 일반적인 문제는 개수가 0인 행을 반환하지 못하는 것입니다. 필터링 조건이 잘못 배치되었을 때 발생하는 현상입니다.

조직당 시험 항목 수를 계산하도록 설계되었지만 개수가 0보다 큰 조직만 반환하도록 설계된 다음 쿼리를 고려해보세요.

<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 절에 있습니다. 여기에 배치된 조건은 가입 다음을 필터링하여 개수가 0인 조직을 효과적으로 제거합니다. 해결책은 필터링 조건을 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
GROUP BY o.name
ORDER BY o.name;</code>

JOIN 내에 필터를 통합하여 일치하는 행만 조인 작업에 포함되도록 합니다. 이렇게 하면 개수가 0인 조직이 실수로 제외되는 것을 방지할 수 있습니다.

중요 사항:

  • COUNT()의 동작: 많은 집계 함수와 달리 COUNT()NULL을 반환하지 않습니다. 따라서 COALESCE(COUNT(col))은 중복됩니다.
  • 열 Null: COUNT() 열에 NOT NULL을 적용하거나 조인 조건이 Null이 아닌 값을 보장하는지 확인하세요.
  • 최적화: 성능을 위해, 특히 대규모 데이터세트의 경우 조직 테이블과 조인하기 전에 하위 쿼리에서 개수를 사전 집계하는 것을 고려하세요. 이는 대부분 또는 모든 행을 계산할 때 특히 유용합니다.

위 내용은 PostgreSQL에서 LEFT JOIN이 0 카운트를 반환하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.