为什么此查询返回“不正确”的结果?

时间:2011-11-05 05:01:44

标签: sql join

我有3张桌子:

'CouponType'表:

 AutoID         Code        Name

    1         CouT001     SunCoupon     
    2         CouT002     GdFriCoupon     
    3         CouT003     1for1Coupon  

'CouponIssued'表:

 AutoID              CouponNo        CouponType_AutoID  

    1                 Co001               1 
    2                 Co002               1
    3                 Co003               1                   
    4                 Co004               2
    5                 Co005               2 
    6                 Co006               2    

'CouponUsed'表:

  AutoID     Coupon_AutoID

    1              2  
    2              3  
    3              5   

我正在尝试使用下面的查询一起加入3个表,但显然我没有为CouponIssued列获得正确的值:

select CouponType.AutoID, Code, Name, Count(CouponIssued.CouponType_AutoID), count(CouponUsed.Coupon_AutoID)
from (CouponType left join CouponIssued
on (CouponType.AutoID = CouponIssued.CouponType_AutoID))
left join CouponUsed
on  (couponUsed.Coupon_AutoID = CouponIssued.AutoID)
group by CouponType.AutoID, code, name
order by code

预期结果应该是:

**Auto ID         Code           Name             Issued            used**

1                 CouT001       SunCoupon           3                  2

2                 CouT002       GdFriCoupon         3                  1

3                 CouT003       1for1Coupon         0                  0

谢谢!

2 个答案:

答案 0 :(得分:1)

SELECT t.AutoID
      ,t.Code
      ,t.Name
      ,count(i.CouponType_AutoID) AS issued
      ,count(u.Coupon_AutoID) AS used
FROM   CouponType t
LEFT   JOIN CouponIssued i ON i.CouponType_AutoID = t.AutoID
LEFT   JOIN CouponUsed u ON u.Coupon_AutoID = i.AutoID
GROUP  BY 1,2,3;

您可以考虑为表列使用较少混淆的名称。我在表格中使用相同数据的相同名称时做了非常好的经验(尽可能明智)。

在您的示例中,AutoID用于三个不同的列,其中两个在另一个表中以不同的名称第二次出现。如果Coupon_AutoID被命名为CouponIssued_AutoID,那么 仍然有意义。

答案 1 :(得分:0)

count(Coupon.CouponType_AutoID)更改为count(CouponIssued.CouponType_AutoID),将count(Coupon.Coupon_AutoID)更改为count(CouponUsed.Coupon_AutoID)