使用 Case 语句更新另一个 table

Using a Case statement to update another table

我有一个 table,其中有一条记录。我需要根据一条记录的 TYPE 列更新另一个 table 中的 8 个字段。我认为 Case 声明是可行的方法,但我正在拔出野兔!我已经搜索并看到了一些接近但不完全的例子!请帮忙!这是我的代码。

UPDATE [dbo].[PART_DIMENSION]

SELECT [SELL_PACK],
    CASE q.PACK_TYPE WHEN 'SELL' then 1,
              [SELL_PACK_UOM] = Q.PACK_ASSMBY,
              [SELL_PACK_QTY] = Q.QTY,
              [SELL_PACK_LENGTH] = Q.LENGTH,
              [SELL_PACK_WIDTH] = Q.WIDTH,
              [SELL_PACK_HEIGHT] = Q.HEIGHT,
              [SELL_PACK_WEIGHT] = Q.WEIGHT,
              [SELL_PACK_INNER_QTY] = Q.INNER_QTY,
              [SELL_PACK_CAN_NEST] = Q.CAN_NEST,
              [SELL_PACK_NEED_RETAIL_PACK] = Q.NEED_RETAIL_PACK
            FROM PART_DIMENSION as a
            INNER JOIN Qubiscan as q
            on a.part_id=q.part_id

    WHEN q.PACK_TYPE='INNER' then
           SET[INNER_PACK]  = 1,
              [INNER_PACK_UOM] = Q.PACK_ASSMBY,
              [INNER_PACK_QTY] = Q.QTY,
              [INNER_PACK_LENGTH] = Q.LENGTH,
              [INNER_PACK_WIDTH] = Q.WIDTH,
              [INNER_PACK_HEIGHT] = Q.HEIGHT,
              [INNER_PACK_WEIGHT] = Q.WEIGHT
            FROM PART_DIMENSION as a
            INNER JOIN Qubiscan as q
            on a.part_id=q.part_id

    WHEN q.PACK_TYPE='MASTER' then
           SET[MASTER_PACK] = 1,
              [MASTER_PACK_UOM] = Q.PACK_ASSMBY,
              [MASTER_PACK_QTY] = Q.QTY,
              [MASTER_PACK_LENGTH] = Q.LENGTH,
              [MASTER_PACK_WIDTH] = Q.WIDTH,
              [MASTER_PACK_HEIGHT] = Q.HEIGHT,
              [MASTER_PACK_WEIGHT] = Q.WEIGHT
            FROM PART_DIMENSION as a
            INNER JOIN Qubiscan as q
            on a.part_id=q.part_id

一次性完成所有事情是一个很好的目标,但有时您可能会尝试一次做太多事情。在这种情况下,CASE 可能不是最佳选择,因为做你想做的事情真的需要大约 24 个 CASE 语句......可行,但我不确定它的可读性如何。我建议首先将其分解为一些更简单的块..考虑一下(希望错别字最少 :)):

Update a
  from part_dimension a
  join qubiscan q
    on a.part_id=q.part_id
   set           a.[MASTER_PACK] = 1,
              a.[MASTER_PACK_UOM] = Q.PACK_ASSMBY,
              a.[MASTER_PACK_QTY] = Q.QTY,
              a.[MASTER_PACK_LENGTH] = Q.LENGTH,
              a.[MASTER_PACK_WIDTH] = Q.WIDTH,
              a.[MASTER_PACK_HEIGHT] = Q.HEIGHT,
              a.[MASTER_PACK_WEIGHT] = Q.WEIGHT
where q.pack_type='MASTER'

对其他两个字段重复此块 lists/pack_types。

由于您正在寻找 SQL Server 版本的加入更新语句,您可以将更新分成三个不同的语句并执行如下操作:

--SELL
UPDATE p1
SET p1.[SELL_PACK] = 1
    ,p1.[SELL_PACK_UOM] = Q.PACK_ASSMBY
    ,p1.[SELL_PACK_QTY] = Q.QTY
    ,p1.[SELL_PACK_LENGTH] = Q.[LENGTH]
    ,p1.[SELL_PACK_WIDTH] = Q.WIDTH
    ,p1.[SELL_PACK_HEIGHT] = Q.HEIGHT
    ,p1.[SELL_PACK_WEIGHT] = Q.[WEIGHT]
    ,p1.[SELL_PACK_INNER_QTY] = Q.INNER_QTY
    ,p1.[SELL_PACK_CAN_NEST] = Q.CAN_NEST
    ,p1.[SELL_PACK_NEED_RETAIL_PACK] = Q.NEED_RETAIL_PACK
FROM [dbo].[PART_DIMENSION] p1
INNER JOIN Qubiscan AS q ON p1.part_id = q.part_id
WHERE q.pack_type = 'SELL';

--INNER
UPDATE p2
SET p2.[INNER_PACK] = 1
    ,p2.[INNER_PACK_UOM] = Q.PACK_ASSMBY
    ,p2.[INNER_PACK_QTY] = Q.QTY
    ,p2.[INNER_PACK_LENGTH] = Q.[LENGTH]
    ,p2.[INNER_PACK_WIDTH] = Q.WIDTH
    ,p2.[INNER_PACK_HEIGHT] = Q.HEIGHT
    ,p2.[INNER_PACK_WEIGHT] = Q.[WEIGHT]
FROM [dbo].[PART_DIMENSION] p2
INNER JOIN Qubiscan AS q ON p2.part_id = q.part_id
WHERE q.pack_type = 'INNER';

--MASTER
UPDATE p3
SET p3.[MASTER_PACK] = 1
    ,p3.[MASTER_PACK_UOM] = Q.PACK_ASSMBY
    ,p3.[MASTER_PACK_QTY] = Q.QTY
    ,p3.[MASTER_PACK_LENGTH] = Q.[LENGTH]
    ,p3.[MASTER_PACK_WIDTH] = Q.WIDTH
    ,p3.[MASTER_PACK_HEIGHT] = Q.HEIGHT
    ,p3.[MASTER_PACK_WEIGHT] = Q.[WEIGHT]
FROM [dbo].[PART_DIMENSION] p3
INNER JOIN Qubiscan AS q ON p3.part_id = q.part_id
WHERE q.pack_type = 'MASTER';

希望对您有所帮助!