집 >데이터 베이스 >MySQL 튜토리얼 >SQL 쿼리에서 여러 배열 집계를 사용할 때 중복 행을 방지하는 방법은 무엇입니까?
쿼리에서 여러 배열 집계 방지
쿼리에서 단일 쿼리 내에서 여러 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!