根据另一行填充行(将价格从分支0复制到所有其他分支)

时间:2019-05-09 10:07:49

标签: sql sql-server sql-update

我正在尝试根据另一行填充行,

例如

  • 更新产品价格表,其中branchID = 0

  • 到所有其他产品,其中每个产品代码的分支ID <> 0

表中有

同一产品的7行,每行的含义是相同的,但唯一的区别是分支ID

我希望分支0行中的所有数据填充产品的其余部分

我当前的更新脚本确实可以运行,但是它占用了事务日志上的大量空间,导致它失败,并且需要2个小时才能运行

UPDATE  ProductPrice
    SET StandardSell = pp2.StandardSell,
        StandardBuy = pp2.StandardBuy,
        InternalCost = pp2.InternalCost,
        BuyPerID =  pp2.BuyPerID,
        AverageCostPerID = pp2.AverageCostPerID,
        InternalCostPerID = pp2.InternalCostPerID,
       SellPerID = pp2.SellPerID
FROM (SELECT BranchID, ProductID, StandardSell, StandardBuy,SellPerID, InternalCost,BuyPerID,AverageCostPerID,InternalCostPerID      
      FROM ProductPrice 
      WHERE BranchID = 0
     ) AS pp2 INNER JOIN
     ProductPrice AS pp1
     on pp1.ProductID = pp2.ProductID       
WHERE pp1.ProductID = pp2.ProductID 

我希望产品的价格从每个产品的第0个分支更新到所有其他分支。

2 个答案:

答案 0 :(得分:0)

这个评论太长了。

第一个观察结果是您应该修复数据模型。在七个记录上重复相同的列可证明您的数据未标准化。您要更新的七个列可能应该在ProductPrice表中。

然后,您需要一个ProductBranch表,其中包含其他列和分支ID。

这就是说,如果您坚持使用数据模型,那么您将坚持使用基本上更新所有行的更新。而是使用所需的所有列创建一个新表:

insert into temp_productprice
    select . . .
    from . . .;

然后截断productprice并将新数据插入其中。批量插入比大型更新更有效。

最后,您还可以尝试使用窗口功能:

with toupdate as (
      select pp.*,
             max(case when branchid = 0 then StandardSell end) as StandardSell_0,
             max(case when branchid = 0 then StandardBuy end) as StandardBuy_0,
      from productprice pp
             . . .
     )
update toupdate
    set StandardSell = StandardSell_0,
        StandardBuy = StandardBuy_0,
        . . .
    from branchid <> 0;

答案 1 :(得分:0)

感谢您的建议,

最后,我只给了日志文件更多的空间。然后让它运行-尽管大声笑需要2个小时。

但是完成了

感谢我发布的脚本可供其他人使用。