我尝试执行我认为非常简单的案例更新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不支持这些类型的更新查询吗?或者我犯了一个基本错误?
答案 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'