집 >데이터 베이스 >MySQL 튜토리얼 >단일 SQL 쿼리에서 여러 `array_agg()` 호출을 결합할 때 중복 데이터를 방지하는 방법은 무엇입니까?
단일 쿼리에서 여러 array_agg() 호출 결합
쿼리에서 여러 array_agg() 호출이 중복을 반환하는 문제가 발생합니다. 데이터. 여러 조인으로 인해 중복된 행이 있으면 원하지 않는 결과가 발생합니다. 이 문제를 해결하기 위해 처음부터 행 곱셈을 피하는 여러 가지 접근 방식을 탐색할 수 있습니다.
해결책 1: 먼저 집계하고 나중에 조인
한 가지 효과적인 방법은 조인을 수행하기 전에 하위 쿼리의 데이터. 이렇게 하면 각 직원 기록이 고유하여 행 곱셈이 방지됩니다. 수정된 쿼리는 다음과 같습니다.
SELECT e.id, e.name, e.age, ad.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 -- PK covers whole row ) e JOIN workingdays wd ON wd.employeeid = e.id GROUP BY e.id, e.name, e.age;
해결책 2: 상관 하위 쿼리 / JOIN LATERAL
또 다른 접근 방식은 PostgreSQL 9.3에서 상관 하위 쿼리 또는 JOIN LATERAL을 활용하는 것입니다. 또는 나중에. 이 기술을 사용하면 기본 쿼리 내에서 각 직원에 대해 집계된 데이터를 검색할 수 있습니다. 수정된 쿼리는 다음과 같습니다.
상관 하위 쿼리:
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'; -- very selective
JOIN 측면:
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'; -- very selective
결론
이러한 접근 방식을 구현하면 행 곱셈을 피하고 원하는 결과를 얻을 수 있습니다. 각 직원의 근무일 배열입니다. 이러한 솔루션을 사용하면 데이터가 적절하게 집계되고 올바르게 병합되므로 추가 필터링이나 사후 처리가 필요하지 않습니다.
위 내용은 단일 SQL 쿼리에서 여러 `array_agg()` 호출을 결합할 때 중복 데이터를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!