有条件更新column1或column2或column3

Zen*_*Zen 0 sql t-sql sql-server

我想写一个SQL更新语句,比如

UPDATE p
SET CASE WHEN inv.name='your' THEN p.your_qty=inv.qty
    CASE WHEN inv.name='other' THEN p.other_qty=inv.qty
    CASE WHEN inv.name='my' THEN p.my_qty=inv.qty
FROM products p
JOIN Qty_products_inv inv
ON p.itemNo= inv.itemNo
Run Code Online (Sandbox Code Playgroud)

Mat*_*lie 5

您需要更新所有三列。 SET无法更新不同行上的不同列。

因此,在加入之前调整源,然后如果没有新值可供选择,则将每列设置回其现有值...

UPDATE
  p
SET
  your_qty  = COALESCE(inv.your_qty , p.your_qty ),
  other_qty = COALESCE(inv.other_qty, p.other_qty),
  my_qty    = COALESCE(inv.my_qty   , p.my_qty   )
FROM
  products p
JOIN
(
  SELECT
    itemNo,
    MAX(CASE WHEN name='your'  THEN qty END) AS your_qty,
    MAX(CASE WHEN name='other' THEN qty END) AS other_qty,
    MAX(CASE WHEN name='my'    THEN qty END) AS my_qty
  FROM
    qty_products_inv
  GROUP BY
    itemNo
)
  inv
    ON p.itemNo = inv.itemNo
Run Code Online (Sandbox Code Playgroud)

抱歉,我是用手机打字的。

编辑:

从我原来的答案来看,不要执行以下操作,因为 @JonArmstrong 的评论表明它不起作用(除非每一行只接受一个更改)

UPDATE
  p
SET
  your_qty  = CASE WHEN inv.name='your'  THEN inv.qty ELSE p.your_qty  END,
  other_qty = CASE WHEN inv.name='other' THEN inv.qty ELSE p.other_qty END,
  my_qty    = CASE WHEN inv.name='my'    THEN inv.qty ELSE p.my_qty    END
FROM
  products p
JOIN
  qty_products_inv inv
    ON p.itemNo = inv.itemNo
Run Code Online (Sandbox Code Playgroud)