2015-02-09 79 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'