잘못된 계산 결과를 초래하는 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
테이블의 각 사용자에 대해 두 개의 관련 테이블 grocery
및 fishmarket
에 대한 방문 횟수를 계산하려고 시도합니다. 그러나 Left 조인의 특성으로 인해 잘못된 결과가 생성됩니다.
왼쪽 조인에 대한 오해
SQL에서는 조인이 왼쪽에서 오른쪽으로 수행됩니다. 이 쿼리에서는 users
과 grocery
사이의 왼쪽 조인이 먼저 수행됩니다. 이로 인해 각 사용자 기록이 해당 식료품 구매 기록에 연결됩니다. 다음으로 첫 번째 조인 결과와 fishmarket
사이에 두 번째 Left 조인이 수행됩니다. 즉, 식료품 구매 기록이 있는 각 사용자 기록이 해당 수산시장 구매 기록과 추가로 결합됩니다.
덧셈 대신 곱셈
이 순차 처리의 의도하지 않은 결과는 grocery
및 fishmarket
의 액세스 횟수가 더해지는 것이 아니라 곱해지는 것입니다. 예를 들어, 사용자가 식료품점을 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!