来自多部分JOIN的SUM()

时间:2013-02-11 15:09:11

标签: sql join sum

SELECT SUM(t.OptLevel) + SUM(o.ReqLevel1) + SUM(b.nOptValue) FROM _Inventory AS i 
        LEFT JOIN _Items AS t ON t.ID64 = i.ItemID
        LEFT JOIN _RefObjCommon AS o ON o.ID = t.RefItemID
        LEFT OUTER JOIN _BindingOptionWithItem AS b ON b.nItemDBID = i.ItemID 
        WHERE i.CharID = 7843 AND i.Slot BETWEEN 0 AND 12 AND i.ItemID != 0

我遇到这个查询时遇到问题,我对连接的兴趣并不像我想的那样。

t.OptLevel始终是来自_Items的> = 0并且该行始终在那里

o.ReqLevel1始终位于_RefObjCommon的1到101之间,行总是在那里

但是,来自b.nOptValue的{​​{1}}是一个并非总是存在的行中的NULL,1或2 ...当其中一个存在_BindingOptionWithItem = 1或2时12行结果(i.Slot BETWEEN 0和12)脚本运行完美:我得到一个总和,但如果b.nOptValue在所有12行结果中返回NULL,则整个查询的总和返回NULL。

我知道有一个简单的解决方案,但我找不到它。

3 个答案:

答案 0 :(得分:1)

在不理解你的问题的情况下,有一个很酷的函数COALESCE(),它返回第一个非空的参数。

SELECT COALESCE(SUM(t.OptLevel), 0) + COALESCE(....

答案 1 :(得分:1)

问题是NULL + <anyvalue>为NULL。

你想:

SELECT coalesce(SUM(t.OptLevel), 0) + coalesce(SUM(o.ReqLevel1), 0) + coalesce(SUM(b.nOptValue) , 0)
. . .

答案 2 :(得分:1)

我可能会从这样的事情开始:

SELECT SUM(t.OptLevel) + SUM(o.ReqLevel1) + COALESCE(SUM(b.nOptValue), 0)
FROM _Inventory AS i 
    JOIN _Items AS t ON t.ID64 = i.ItemID
    JOIN _RefObjCommon AS o ON o.ID = t.RefItemID
    LEFT JOIN _BindingOptionWithItem AS b ON b.nItemDBID = i.ItemID 
WHERE i.CharID = 7843
    AND i.Slot BETWEEN 0 AND 12
    AND i.ItemID != 0

如果连接始终匹配,则不需要外连接(包括左连接)。在你可能无法匹配的地方,你需要左连接,然后利用COALESCE,它返回它可以找到的第一个非空值,这可能是你提供的常量(在此为0)情况)。