1
UPDATE @DList1
SET
Listed = a.Listed +  b.Listed,
Sold = b.Sold,
Volume = a.Volume + ISNULL(b.Volume, 0)
FROM @DList1 a, @DList2 b 
WHERE a.ItemID = b.ItemID

上記の更新されたステートメントでは、列[Listed]が正しく更新されて[Volume]いません。

Dlist2

ItemID  Listed  Sold Volume
104     NULL    1    266000
778     1       1    5390
200     1       0    266000

Dlist1

ItemID  Listed  Sold Volume
200     1       0    6395000
779     1       0    155000

更新後@Dlist1

ItemID  Listed  Sold Volume
200     1       0    6661000
779     1       0    155000

図式:

DECLARE @DList1 TABLE 
( 
    ItemID          NVARCHAR(20)
    , Listed        BIGINT
    , Sold          BIGINT
    , Volume        BIGINT
)

DECLARE @DList2 TABLE 
( 
      ItemID        NVARCHAR(20)
    , Listed        BIGINT
    , Sold          BIGINT
    , Volume        BIGINT
)
4

2 に答える 2

3

最初の行を に変更する必要がありますUPDATE a。このようにして、更新したいレコードがbyDList1に一致するレコードであることを SQL に伝えます (以下で参照しているものと同じものを更新しています)。DList2ItemIDDList1

from a,b where...また、より読みやすく保守しやすいクエリにつながるため、代わりに結合構文を使用してください。

UPDATE a
SET
  Listed = a.Listed +  b.Listed,
  Sold = b.Sold,
  Volume = a.Volume + ISNULL(b.Volume, 0)
FROM @DList1 a
JOIN @DList2 b 
  on a.ItemID = b.ItemID;

ここに SQLFiddle リンクがあります: http://www.sqlfiddle.com/#!3/b8cfc/3

于 2013-02-25T19:39:11.670 に答える
2

2 つのテーブルを結合して更新し、使用している場合は必ずisnull()orを使用してください。coalesce()adding/concatenatingnullable fields

UPDATE a 
SET a.Listed = isnull(a.Listed, b.Listed),
    a.Sold = b.Sold,
    a.Volume = a.Volume + isnull(b.Volume, 0)
FROM @DList1 a join @DList2 b  on a.ItemID = b.ItemID

SQL フィドルのデモ

于 2013-02-25T19:39:21.153 に答える