如果某字段为NULL则复制上一条不为null的数据(主键连续和不连续情况下)

表结构:

 

SQL(主键连续):

 

SELECT TOP 1000 [ActId]
      ,[ActName]
      INTO #T --创建临时表测试,如果测试没问题,改成原表
  FROM [DB_Test].[dbo].[Act]

 WHILE EXISTS(SELECT * FROM #T WHERE ActName IS NULL)
 BEGIN
    declare @a INT
    DECLARE @b VARCHAR(50)
    SELECT @a=#T.[ActId], @b=[ActName] FROM    #T  
        JOIN (SELECT TOP 1 a.ActId FROM #T a WHERE a.ActName IS NULL) b ON b.ActId-1 = #T.ActId
    UPDATE #T SET ActName=@b WHERE ActId=@a+1 AND ActName IS NULL
 END

 

SQL(主键不连续):

 

 --需求:如果ActName为NULL则复制上一条不为null的数据(主键ActId不连续)
 
 SELECT [ActId]
      ,[ActName]
      ,ROW_NUMBER() OVER(ORDER BY ActId) AS 'nid' --虚拟连续主键
      INTO #T --临时表
  FROM [DB_Test].[dbo].[Act] 
 
 WHILE EXISTS(SELECT 1 FROM dbo.Act WHERE ActName IS NULL) --遍历原表
 BEGIN
     DECLARE @actId INT
    DECLARE @actName VARCHAR(50)
    SELECT TOP 1 @actId=ActId FROM #T WHERE ActName IS NULL --找到ActName为NULL第一行的ActId

    SELECT @actName = c.ActName FROM dbo.Act c WHERE c.ActId = (    --找到原表ActName为NULL第一行的上一行的ActName
        SELECT  b.ActId FROM #T b WHERE  b.nid = (
            SELECT TOP 1 a.nid - 1 FROM #T a WHERE a.ActName IS NULL))

    UPDATE dbo.Act SET ActName=@actName WHERE ActId=@actId --更新
    DELETE FROM #T WHERE ActId=@actId --删除临时表ActName为NULL第一行
 END
 DROP TABLE #T

 

posted @ 2017-11-01 14:42  花生打代码会头痛  阅读(291)  评论(0)    收藏  举报