>데이터 베이스 >MySQL 튜토리얼 >단일 SQL 쿼리에서 여러 `array_agg()` 호출을 결합할 때 중복 데이터를 방지하는 방법은 무엇입니까?

단일 SQL 쿼리에서 여러 `array_agg()` 호출을 결합할 때 중복 데이터를 방지하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-29 13:56:23696검색

How to Avoid Redundant Data When Combining Multiple `array_agg()` Calls in a Single SQL Query?

단일 쿼리에서 여러 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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