2011-04-11 62 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