使用先前记录中的数据更新SQL Server表记录字段

时间:2012-05-05 13:27:10

标签: sql sql-server sql-server-2008

我需要从下面的第一条记录更新第二条记录AFS_OH列(ForecastID = 23),其中包含之前的AFS_ToProduce值(ForecastID = 22)。换句话说,AFS_OH = 307923的第二个记录值。

另外,我需要为整个表格更新这些值,因此我根据AFS_ToProduce < 0的条件会有所不同,因为您会在下面的WHERE子句中注意到这一点。

我的下面的脚本是更新相同的记录值而不是以下记录。谢谢你的帮助!

ForecastID        AFS_OH     AFS_ToProduce
22                307923    -307923
23                     0     316602

这是我的方法:

UPDATE FC_Test
SET AFS_OH = (AFS_ToProduce * (-1))
FROM FC_Test S3
INNER JOIN
(
    SELECT S1.FORECASTID, S2.AFS_ToProduce AS AFS_OH
    FROM FC_Test S1
    LEFT OUTER JOIN
    (
        SELECT *
        FROM FC_Test
    ) S2
    ON S1.ForecastID = S2.ForecastID
)S4 ON S3.ForecastID = S4.ForecastID
WHERE AFS_ToProduce < 0

2 个答案:

答案 0 :(得分:1)

如果下一行具有正AFS_ToProduce,则以下更新会将AFS_ToProduce的负值传输到下一行。如果不是,则该行将被忽略。 如果AFS_ToProduce为负,则内部select top 1将检索上一行;如果没有,将跳过来自fc_test的当前行。这允许在ForecastID中存在空白。

update fc_test
set AFS_OH = - fc2.AFS_ToProduce
from fc_test
cross apply
(
  select fc2.AFS_ToProduce
  from 
  (
    select top 1
        fc2.AFS_ToProduce
      from fc_test fc2
     where fc2.ForecastID < fc_test.ForecastID
     order by fc2.ForecastID desc
  ) fc2
  where fc2.AFS_ToProduce < 0
) fc2
where fc_test.AFS_ToProduce > 0

TEST在Sql Fiddle

答案 1 :(得分:0)

试试这个

DECLARE @tbl table (i int, p int)

INSERT INTO @tbl (i,p) VALUES (1,1),(10,10),(11,11),(20,20)

SELECT * FROM @tbl

UPDATE t1
SET t1.p=t2.p
FROM @tbl t1
     CROSS JOIN @tbl t2
WHERE t2.i=(SELECT max(i)
               FROM @tbl t
               WHERE i<t1.i)


SELECT * FROM @tbl