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。
我知道有一个简单的解决方案,但我找不到它。
答案 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)情况)。