MySQL加入查询混淆

时间:2014-12-30 10:34:24

标签: mysql sql join

我有3张表格如下:

  1. 产品(product_id,product_desc)
  2. product_sales_branch_a(product_id,qty)
  3. product_sales_branch_b(product_id,qty)
  4. 我使用加入产品& product_sales_branch_a使用以下脚本获取销售数量:

    select A.product_desc, sum(B.qty) from product A 
    join product_sales_branch_a B on B.product_id = A.product_id
    where A.product_id = 'ABC*'
    

    结果:

    product_desc | sum(B.qty)    
    1234         | 16
    

    结果正确返回。

    然后,我使用加入产品& product_sales_branch_b使用以下脚本获取销售数量:

    select A.product_desc, sum(C.qty) from product A 
    join product_sales_branch_b C on C.product_id = A.product_id 
    where A.product_id = 'ABC'
    

    结果:

    product_desc | sum(C.qty)
    1234         | 20
    

    结果也会正确返回。

    但是现在,我试图通过以下脚本加入3表:

    select A.product_desc, sum(B.qty), sum(C.qty) from product A 
    join product_sales_branch_a B on B.product_id = A.product_id 
    join product_sales_branch_b C on C.product_id = A.product_id 
    where A.product_id = 'ABC'
    

    结果:

    product_desc | sum(B.qty) | sum(C.qty)
    1234         | 288        | 280
    

    这不是我期望的结果。

    我的SQL查询有什么问题吗?

2 个答案:

答案 0 :(得分:1)

问题是当你加入第三个表时,第二个和第三个表之间没有关系。因此,如果表1和2的连接返回m行,并且1和3的连接返回n行,则将获得m * n行作为输出。这就是为什么你的总和比预期的要大得多。

Sample

解决此问题的一种方法是使用count distinct,如果您确定qty没有重复值。但是,这在实际数据中不太可能,因此您应该考虑使用@jarlh上面建议的子查询方法:

select A.product_desc as desc,
   (select sum(B.qty) from product_sales_branch_a B where B.product_id = A.product_id and A.product_id = 'ABC') as bqty,
   (select sum(C.qty) from product_sales_branch_b C where C.product_id = A.product_id  and A.product_id = 'ABC') as cqty
from product A

答案 1 :(得分:0)

在这种情况下我会选择子选项:

select A.product_desc,
       (select sum(B.qty) from product_sales_branch_a B where B.product_id = A.product_id),
       (select sum(C.qty) from product_sales_branch_b C where C.product_id = A.product_id) 
from product A 
where A.product_id = 'ABC'