Sql server 使用自连接和聚合进行更新

Sql server 使用自连接和聚合进行更新,sql-server,aggregate,self-join,Sql Server,Aggregate,Self Join,我正在尝试使用自连接和聚合更新表 例如,表具有以下列: 商店,商品,价格,低价,低价商店 我需要填充低价和低价商店 低价是: Select item,min(price) group by item lowprice商店将是每个商品的min(price)商店 我也希望能更进一步。假设两家商店以相同的低价提供一种商品。那么低价商店的值将是“商店a/商店b”,但这部分不太重要 我使用的是SQL Server。我同意@JNK的评论,您最好使用视图。对于SQL Server 2005+您可以尝试: C

我正在尝试使用自连接和聚合更新表

例如,表具有以下列:

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

我需要填充
低价
低价商店

低价
是:

Select item,min(price) group by item
lowprice商店
将是每个商品的
min(price)
商店

我也希望能更进一步。假设两家商店以相同的
低价提供一种商品。那么
低价商店
的值将是“商店a/商店b”,但这部分不太重要


我使用的是SQL Server。

我同意@JNK的评论,您最好使用
视图。对于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
如果仍要执行
更新
,请尝试:

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

我同意@JNK的评论,即您最好使用
视图
。对于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
如果仍要执行
更新
,请尝试:

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

您使用的是什么版本的SQL Server?这是一个糟糕的数据结构。当价格发生变化时,是否要检查该表中的每条记录并更新该项目所有出现的低价?与lowprice_Store相同,在每次运行插入/更新/删除之后,您是否要验证?这将给您带来很多麻烦…您最好将其放在视图中,而不是更改此信息的基础表。您使用的是什么版本的SQL Server?这是一个糟糕的数据结构。当价格发生变化时,是否要检查该表中的每条记录并更新该项目所有出现的低价?与lowprice_Store相同,在每次运行插入/更新/删除之后,您是否要验证?这将给您带来很多麻烦…您最好将其放在视图中,而不是为这些信息更改基础表。
OVER。。。分区
很好,但这些黑客问题通常来自于那些被过时系统困住的开发人员,他们需要在没有流线型结构的情况下实现相同的语义。。。分区(PARTITION)
很好,但这些黑客问题通常来自于那些被过时系统困住的开发人员,他们需要在没有流线型结构的情况下实现相同的语义。