>데이터 베이스 >MySQL 튜토리얼 >다중 Left 조인으로 인해 SQL에서 어떻게 잘못된 계산 결과가 발생할 수 있으며, 이 문제를 어떻게 해결할 수 있습니까?

다중 Left 조인으로 인해 SQL에서 어떻게 잘못된 계산 결과가 발생할 수 있으며, 이 문제를 어떻게 해결할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-23 12:16:10822검색

How Can Multiple Left Joins Lead to Incorrect Count Results in SQL, and How Can This Be Fixed?

잘못된 계산 결과를 초래하는 SQL 다중 왼쪽 조인에 대한 트랩 및 솔루션

SQL을 사용할 때 여러 개의 Left Join을 올바르게 처리하지 않으면 예상치 못한 결과가 발생할 수 있습니다. 다음 쿼리를 고려해보세요.

<code class="language-sql">SELECT
    t1."id" AS "User ID",
    t1.account_balance AS "Account Balance",
    count(t2.user_id) AS "# of grocery visits",
    count(t3.user_id) AS "# of fishmarket visits"
FROM users t1
LEFT OUTER JOIN grocery t2 ON (t2.user_id=t1."id") 
LEFT OUTER JOIN fishmarket t3 ON (t3.user_id=t1."id") 
GROUP BY t1.account_balance,t1.id
ORDER BY t1.id</code>

이 쿼리는 users 테이블의 각 사용자에 대해 두 개의 관련 테이블 groceryfishmarket에 대한 방문 횟수를 계산하려고 시도합니다. 그러나 Left 조인의 특성으로 인해 잘못된 결과가 생성됩니다.

왼쪽 조인에 대한 오해

SQL에서는 조인이 왼쪽에서 오른쪽으로 수행됩니다. 이 쿼리에서는 usersgrocery 사이의 왼쪽 조인이 먼저 수행됩니다. 이로 인해 각 사용자 기록이 해당 식료품 구매 기록에 연결됩니다. 다음으로 첫 번째 조인 결과와 fishmarket 사이에 두 번째 Left 조인이 수행됩니다. 즉, 식료품 구매 기록이 있는 각 사용자 기록이 해당 수산시장 구매 기록과 추가로 결합됩니다.

덧셈 대신 곱셈

이 순차 처리의 의도하지 않은 결과는 groceryfishmarket의 액세스 횟수가 더해지는 것이 아니라 곱해지는 것입니다. 예를 들어, 사용자가 식료품점을 3번 방문하고 수산시장을 4번 방문했다면 쿼리 결과 예상 방문수는 7회가 아닌 12회가 됩니다.

해결책: 집계에 하위 쿼리 사용

이 문제를 해결하려면 테이블에 합류하기 전에 방문 횟수 집계(개수)를 수행해야 합니다. 이는 하위 쿼리를 사용하여 수행할 수 있습니다.

<code class="language-sql">SELECT u.id
, u.account_balance
, g.grocery_visits
, f.fishmarket_visits
FROM   users u
LEFT   JOIN (
   SELECT user_id, count(*) AS grocery_visits
   FROM   grocery
   GROUP  BY user_id
   ) g ON g.user_id = u.id
LEFT   JOIN (
   SELECT user_id, count(*) AS fishmarket_visits
   FROM   fishmarket
   GROUP  BY user_id
   ) f ON f.user_id = u.id
ORDER  BY u.id;</code>

이 수정된 쿼리는 하위 쿼리의 방문수를 집계한 다음 집계된 결과를 users 테이블과 조인하여 방문수가 실수로 곱해지지 않도록 합니다.

위 내용은 다중 Left 조인으로 인해 SQL에서 어떻게 잘못된 계산 결과가 발생할 수 있으며, 이 문제를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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