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 from_Itemsであり、行は常にそこにあります

o.ReqLevel1は常に 1 から 101 の間で_RefObjCommonあり、行は常にそこにあります

ただし、b.nOptValuefrom_BindingOptionWithItemは、常に存在するとは限らない行からの NULL、1、または 2 です... b.nOptValue12 行の結果 ( i.Slot BETWEEN 0 AND 12 ) のいずれかに = 1 または 2 が存在する場合、スクリプトは完全に実行されます。合計を取得しb.nOptValueますが、12 行すべての結果で NULL を返すと、クエリ全体で合計が NULL が返されます。

簡単な解決策があることは知っていますが、見つけることができません。

4

3 に答える 3

1

あなたの質問を理解してCOALESCE()いなくても、null ではない最初のパラメーターを返すこのクールな関数があります。

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、最初に見つかった null 以外の値が返されます。これは、指定した定数 (この場合は 0) である可能性があります。

于 2013-02-11T15:25:14.030 に答える