我正在尝试根据另一行填充行,
例如
更新产品价格表,其中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个分支更新到所有其他分支。
答案 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个小时。
但是完成了
感谢我发布的脚本可供其他人使用。