使用同一个表中的特定值更新多个行

时间:2016-07-07 10:56:56

标签: tsql sybase-ase

所以,我有下一张桌子:

time    |  name   |  ID  |
12:00:00| access  |  1   |
12:05:00| select  | null |
12:10:00| update  | null |
12:15:00| insert  | null |
12:20:00|   out   | null |
12:30:00| access  |  2   |
12:35:00| select  | null |

表格更大(aprox 1-1,5 mil行),ID将等于2,3,4等行和之间的行。

以下结果应为:

time    |  name  |  ID  |
12:00:00| access |  1   |
12:05:00| select |  1   |
12:10:00| update |  1   |
12:15:00| insert |  1   |
12:20:00|   out  |  1   |
12:30:00| access |  2   |
12:35:00| select |  2   |

在不使日志满的情况下更新行的最简单方法是什么?比如,一次一个ID。

2 个答案:

答案 0 :(得分:2)

您可以使用子查询执行此操作:

UPDATE YourTable t
SET t.ID = (SELECT TOP 1 s.ID
            FROM YourTable s
            WHERE s.time < t.time AND s.name = 'access'
            ORDER BY s.time DESC)
WHERE t.name <> 'access' 

(ID,time,name)上的索引会有所帮助。

答案 1 :(得分:1)

您可以使用CTE执行以下操作:

;WITH    myCTE
          AS ( SELECT   time
                      , name
                      , ROW_NUMBER() OVER ( PARTITION BY name ORDER BY time ) AS [rank]
                      , ID
               FROM     YourTable
             )
    UPDATE  myCTE
    SET     myCTE.ID = myCTE.rank 

SELECT  *
FROM    YourTable ORDER BY ID