3
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总是 >= 0 从_Items并且该行总是在那里

o.ReqLevel1始终在 1 到 101 之间,_RefObjCommon并且该行始终存在

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

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

4

3 回答 3

1

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

SELECT COALESCE(SUM(t.OptLevel), 0) + COALESCE(....
于 2013-02-11T15:24:21.490 回答
1

问题是NULL + <anyvalue>NULL。

你要:

SELECT coalesce(SUM(t.OptLevel), 0) + coalesce(SUM(o.ReqLevel1), 0) + coalesce(SUM(b.nOptValue) , 0)
. . .
于 2013-02-11T15:24:25.253 回答
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)。

于 2013-02-11T15:25:14.030 回答