我认为我想做的事情相当简单,但我收到的数据差别很大。
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
加入结果的总和,然后减去未兑现的次数,以便在一行中提供兑换的总数。
我已经对我的总和字段进行了各种修改,但数字看起来很大,所以我认为它会倍增它们。
我有一段时间没有使用过连接,而且我有点生疏。
答案 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。