更新使用自联接和聚合

时间:2011-04-11 20:22:36

标签: sql-server aggregate self-join

我正在尝试使用自联接和聚合来更新表。

例如,表格包含以下列:

  

商店,商品,价格,低价,低价商店

我需要填充lowpricelowprice store

lowprice将是:

Select item,min(price) group by item

lowprice store将是每个商品min(price)的商店。

我希望能够更进一步。假设两家商店在同一lowprice提供商品。然后lowprice store的值将是'存储/存储b',但这部分不太重要。

我正在使用SQL Server。

1 个答案:

答案 0 :(得分: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