SQL中多个表的总和

时间:2012-11-08 11:19:47

标签: sql join sum

我认为我想做的事情相当简单,但我收到的数据差别很大。

select sum(cast(vi.qty - vi.unredeemed as bigint))
  from red.dbo.setup vc
  full join red.dbo.test bt
    on bt.batch_no = vc.batch_no
  join red.dbo.live vi
 where vi.date_issued between '2012-01-01' and '2012-01-01' 
   and vc.denom ='1' 
   and substring(vi.issue_id,3,1) = '4'

我要做的是将3张桌子加在一起,然后加入qty加入结果的总和,然后减去未兑现的次数,以便在一行中提供兑换的总数。

我已经对我的总和字段进行了各种修改,但数字看起来很大,所以我认为它会倍增它们。

我有一段时间没有使用过连接,而且我有点生疏。

2 个答案:

答案 0 :(得分:1)

您未加入与您加入的第二次加入(dbo.live)的任何条件。另一件事是你提到只加入。它是完整的还是左或右连接。根据您的情况而有所不同

答案 1 :(得分:1)

您的问题是您遗漏了第二个ON

JOIN子句
select SUM(CAST(vi.QTY -vi.unredeemed as bigint))
from red.dbo.setup vc
FULL Join red.dbo.test bt on bt.batch_no = vc.batch_no
JOIN red.dbo.live vi ON ?? -- something needs to be added here, like vi.someId =vc.someOtherId

where vi.date_issued between '2012-01-01' and '2012-01-01' and vc.denom ='1' and      SUBSTRING(vi.ISSUE_ID,3,1) ='4'

你是对的,你观察到的“乘法”效应是由于缺少ON子句导致的Cartesian product。带有未指定的ON子句的简单JOIN会生成CROSS JOIN