SQL Case基于select更新到两个不同的列

时间:2015-02-09 08:51:11

标签: sql sql-server

我尝试执行我认为非常简单的案例更新SQL到基于select的两个不同列:

PROD_TB

Product_Code   Reg_Price     Sale_Price
     A           1000           2000

PRICE_TB

Product_Code   Type    Price
     A         REG     3000
     A         SALE    4000

所需的更新结果:

PROD_TB

Product_Code   Reg_Price     Sale_Price
     A           3000           4000

我的尝试:

UPDATE PROD_TB
SET Reg_Price = CASE 
                   WHEN PRICE_TB.Type = 'REG' 
                     THEN PRICE_TB.Price 
                     ELSE Reg_Price 
                END, 
    Sale_Price = CASE 
                    WHEN PRICE_TB.Type = 'SALE' 
                      THEN PRICE_TB.Price 
                      ELSE Sale_Price 
                 END
FROM 
    PROD_TB
JOIN 
    PRICE_TB ON PROD_TB.PRODUCT_CODE = PRICE_TB.PRODUCT_CODE

运行上述SQL只会更新常规价格,而不是销售价格。 SQL不支持这些类型的更新查询吗?或者我犯了一个基本错误?

3 个答案:

答案 0 :(得分:6)

这样的东西?基本上,只需加入PRICE_TB中的集合,条件就是您要从中获取哪一列。

但是假设每个更新的PROD_TB列名称只有一个PRICE_TB.TYPE,并且每个PROD_TB列始终包含PRICE_TB中的值,否则它将为NULL并且不会返回该行。因此,请确保您知道此处可能存在的数据变体。

UPDATE PROD
SET Reg_Price = REG.Price, Sale_Price = SALE.Price
FROM PROD_TB PROD
JOIN PRICE_TB REG ON REG.Product_Code = PROD.Product_Code AND REG.Type = 'REG'
JOIN PRICE_TB SALE ON SALE.Product_Code = PROD.Product_Code AND SALE.Type = 'SALE'

答案 1 :(得分:1)

你需要先将数据放到一行,这里的例子总是拿最大的价格,以防PRICE_TB中有多个,否则它的工作方式与@Kahn的sql相同。

UPDATE 
  PROD
SET 
  PROD.Reg_Price = PRICE.Reg_Price,
  PROD.Sales_Price = PRICE.Sales_Price
FROM PROD_TB PROD, cross apply (
  select 
    max(CASE WHEN Type = 'REG' THEN Price ELSE 0 end) as Reg_Price,
    max(CASE WHEN Type = 'SALE' THEN Price ELSE 0 end) as Sale_Price
  from
    PRICE_TB PRICE
  where
    PRICE.Product_Code = PROD.Product_Code
) PRICE

答案 2 :(得分:0)

如果您的表PRICE_TB并不总是包含这两个值,您可以使用它来确保表格仍然更新:

UPDATE t1
SET 
  Reg_Price = coalesce(t2.Price, t1.Reg_Price),
  Sale_Price = coalesce(t3.Price, t1.Sale_Price)
FROM PROD_TB t1
LEFT JOIN
  PRICE_TB t2
ON 
  t1.ProductCode = t2.ProductCode AND
  t2.[Type] = 'REG'
LEFT JOIN
  PRICE_TB t3
ON 
  t1.ProductCode = t3.ProductCode AND
  t3.[Type] = 'SALE'
WHERE 
  t2.[Type] = 'REG' OR
  t3.[Type] = 'SALE'