2012-04-09 50 views
1

我尝试使用下面的SQL检索总量接收,总量从3个表销售:3路SQL加入返回坏数据

select ITEMS.ITEM_NO, SUM(RECEIVINGS.QTY_RECVD), SUM(SALES.QTY_SOLD) 
from ITEMS 
left join RECEIVINGS 
on ITEMS.ITEM_NO = RECEVINGS.ITEM_NO 
left join SALES 
on ITEMS.ITEM_NO = SALES.ITEM_NO 
WHERE ITEMS.ITEM_NO = '12345' 
GROUP BY ITEMS.ITEM_NO 

以上的回报数据的查询是比实际值高几个数量级。但是,如果我将它分解为两个查询:

select ITEMS.ITEM_NO, SUM(RECEIVINGS.QTY_RECVD) 
from ITEMS 
left join RECEIVINGS 
on ITEMS.ITEM_NO = RECEVINGS.ITEM_NO 
WHERE ITEMS.ITEM_NO = '12345' 
GROUP BY ITEMS.ITEM_NO 


select ITEMS.ITEM_NO, SUM(SALES.QTY_SOLD) 
from ITEMS 
left join SALES 
on ITEMS.ITEM_NO = SALES.ITEM_NO 
WHERE ITEMS.ITEM_NO = '12345' 
GROUP BY ITEMS.ITEM_NO 

它完美地工作。是什么赋予了?是否有任何理由加入所有三个表的第一个查询将无法工作,但两个单独的查询将?

回答

7

如果receivingssales有多行(尤其是如果两行都有多行),那么这些值将分别乘以另一行中的行数。解决这个问题的一种方法是分别计算总量,然后加入:

select ITEMS.ITEM_NO, COALESCE(R.SUM_RECEIVINGS,0), COALESCE(S.SUM_SALES,0) 
from ITEMS 
left join (SELECT RECEIVINGS.ITEM_NO, SUM(RECEIVINGS.QTY_RECVD) as SUM_RECEIVINGS 
    FROM RECEIVINGS 
    GROUP BY RECEIVINGS.ITEM_NO) as R ON ITEMS.ITEM_NO = R.ITEM_NO 
left join (SELECT SALES.ITEM_NO, SUM(SALES.QTY_RECVD) as SUM_SALES 
    FROM SALES 
    GROUP BY SALES.ITEM_NO) as S ON ITEMS.ITEM_NO = S.ITEM_NO 
WHERE ITEMS.ITEM_NO = '12345' 
+0

+1,虽然标签上是TSQL,所以它应该是'COALESCE'或'ISNULL'取代'NVL' – Lamak 2012-04-09 15:01:57

+0

+1 - 这几乎肯定是问题所在,以及为纠正它而必须完成的工作类型。 – 2012-04-09 15:04:15

+0

这不是“如果有一个比另一个更多”,它更多“如果任一个有多行,尤其是如果两行都有多行” – 2012-04-09 15:06:58