>데이터 베이스 >MySQL 튜토리얼 >SQL 쿼리에서 여러 배열 집계를 사용할 때 중복 행을 방지하는 방법은 무엇입니까?

SQL 쿼리에서 여러 배열 집계를 사용할 때 중복 행을 방지하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-30 07:34:09331검색

How to Avoid Duplicate Rows When Using Multiple Array Aggregates in a SQL Query?

쿼리에서 여러 배열 집계 방지

쿼리에서 단일 쿼리 내에서 여러 array_agg() 함수를 사용하려고 합니다. 다른 테이블에서 배열을 검색합니다. 그러나 이 접근 방식은 중복된 행과 왜곡된 결과로 이어집니다.

문제

여러 조인 및 집계 기능을 수행할 때 결과 집합이 중복으로 부풀려질 수 있습니다. 귀하의 경우 주소 테이블과 근무일 테이블을 결합하면 각 직원에 대해 여러 행이 생성되어 집계된 배열에 중복 항목이 생성됩니다.

해결책: 별도의 집계 및 조인

이 문제를 해결하려면 조인 프로세스에서 집계 작업을 분리하는 것이 좋습니다. 다음 접근 방식을 고려하십시오.

먼저 집계하고 나중에 조인:

먼저 하위 쿼리를 사용하여 각 테이블의 데이터를 별도로 집계합니다. 그런 다음 기본 키 또는 공통 열을 기반으로 집계된 결과를 조인합니다.

SELECT e.id, e.name, e.age, e.streets, array_agg(wd.day) AS days
FROM (
   SELECT e.id, e.name, e.age, array_agg(ad.street) AS streets
   FROM   employees e
   JOIN   address  ad ON ad.employeeid = e.id
   GROUP  BY e.id
   ) e
JOIN   workingdays wd ON wd.employeeid = e.id
GROUP  BY e.id, e.name, e.age;

상관 하위 쿼리 또는 JOIN LATERAL:

데이터를 선택적으로 필터링하려면 다음을 고려하세요. 상관 하위 쿼리 또는 LATERAL 조인 사용 PostgreSQL:

상관 하위 쿼리:

SELECT name, age
    , (SELECT array_agg(street) FROM address WHERE employeeid = e.id) AS streets
    , (SELECT array_agg(day) FROM workingdays WHERE employeeid = e.id) AS days
FROM   employees e
WHERE  e.namer = 'peter';

JOIN LATERAL(PostgreSQL 9.3 이상):

SELECT e.name, e.age, a.streets, w.days
FROM   employees e
LEFT   JOIN LATERAL (
   SELECT array_agg(street) AS streets
   FROM   address
   WHERE  employeeid = e.id
   GROUP  BY 1
   ) a ON true
LEFT   JOIN LATERAL (
   SELECT array_agg(day) AS days
   FROM   workingdays
   WHERE  employeeid = e.id
   GROUP  BY 1
   ) w ON true
WHERE  e.name = 'peter';

이러한 접근 방식은 집계된 배열이 해당 배열과 올바르게 연결되도록 보장합니다. 직원들에게 기대되는 결과를 제공합니다.

위 내용은 SQL 쿼리에서 여러 배열 집계를 사용할 때 중복 행을 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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