2015-02-09 44 views
1

我试图完成什么,我相信基于选择一个非常简单的情况下更新SQL两个不同的列:SQL案例更新两个不同的列基础上选择

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

您需要删除第二个'set'和使用' ,而不是那个。 – 2015-02-09 08:54:20

+0

你应该只使用一个“set”,比如:update table set col1 = a,col2 = b,col3 = c ... – 2015-02-09 08:54:22

+0

Woops。我创建简单例子的错误。修正了 – l46kok 2015-02-09 08:55:00

回答

6

像这样的东西?基本上,只要加入PRICE_TB中的设置就可以从中获得哪一列。

但是,这是假设您将只有一个PRICE_TB.TYPE每个更新的PROD_TB列名称,并且每个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

令人难以置信的愚蠢的我..这不知何故溜走了我的脑海..谢谢我会在几分钟内接受 – l46kok 2015-02-09 09:00:17

+0

发生在我们最好的,无后顾之忧。 :) – Kahn 2015-02-09 09:05:01

1

您需要将数据放在一个排第一,这里的例子总是获取最大的价格,万一有一个以上的在PRICE_TB,否则它应该工作一样@卡恩的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 
+0

如果表PRICE_TB中有第三种类型,并且没有其他匹配的行,则会将价格的值设置为0.不确定这是需要的。隐藏的功能也许。负值也会被设置为0.不太可能发生,但在不知道业务逻辑的情况下仍然无法排除任何事情 – 2015-02-09 09:09:16

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'