2011-04-11 64 views
0

我想使用自加入和聚合來更新表。更新使用自加入和聚合

例如,一個表有以下幾列:

店,商品,價格,lowprice,lowprice店

我需要填充lowpricelowprice store

lowprice將是:

Select item,min(price) group by item 

lowprice store將與min(price)每個項目的商店。

我希望能夠更進一步。假設兩家商店提供相同的商品lowprice。那麼lowprice store的值就是'store a/store b',但這個部分並不重要。

我正在使用SQL Server。

+0

什麼版本的SQL Server您使用的是? – Lamak 2011-04-11 20:25:58

+1

這是一個可怕的***數據結構。當價格發生變化時,您是否要檢查該表中的每條記錄並更新該項目所有實例的低價格?與lowprice_Store一樣,您是否要驗證每次插入/更新/刪除後運行?這會導致你很多頭痛...... – JNK 2011-04-11 20:31:36

+0

你最好把它放在一個視圖中,而不是改變你的這個信息的基礎表。 – JNK 2011-04-11 20:37:06

回答

3

我同意@JNK的評論,你最好用VIEW。對於SQL Server 2005 +,你可以嘗試:

CREATE VIEW LowPrices 
AS 

SELECT A.store, A.item, A.price, A.Low_Price, MIN(B.store) Low_Price_Store 
FROM ( SELECT *, MIN(price) OVER(PARTITION BY item) Low_Price 
    FROM YourTable) A 
JOIN YourTable B 
ON A.Low_Price = B.price 
GROUP BY A.store, A.item, A.price, A.Low_Price 

如果你還想做UPDATE,然後嘗試:

WITH CTE AS 
(
    SELECT A.store, A.item, A.price, A.Low_Price, MIN(B.store) Low_Price_Store 
    FROM ( SELECT *, MIN(price) OVER(PARTITION BY item) Low_Price 
      FROM YourTable) A 
    JOIN YourTable B 
    ON A.Low_Price = B.price 
    GROUP BY A.store, A.item, A.price, A.Low_Price 
) 

UPDATE A 
SET A.LowPrice = B.Low_Price, 
    A.LowPriceStore = B.Low_Price_Store 
FROM YourTable A 
JOIN CTE B 
ON A.store = B.Store AND A.item = B.item 
+0

「OVER ... PARTITION」很棒,但這些駭人聽聞的問題常常出現在開發人員身上,這些人過時的系統需要在沒有精簡構造的情況下實現相同的語義。 – RubyTuesdayDONO 2012-10-15 21:59:50