递归更新

时间:2015-09-28 14:13:46

标签: sql sql-server

我刚刚在我的桌子上创建了一个列调用UPDATE,我想根据我的数据填写它。

每当一个对象从主键(ID,YEAR)更改时,我想更新列UPDATE

||      ID      ||      YEAR        ||      OBJECT      ||      UPDATE
    1               2010                  1                 2010
    2               2010                  2                 2010
    3               2011                  3                 2011
    1               2011                  1                 2010
    2               2011                  1                 2011
    3               2011                  1                 2011

我不知道我有多少查询和多年。但我只有很少的对象

我很感激你的帮助

2 个答案:

答案 0 :(得分:1)

根据您提供的示例,这是应该提供UPDATE列的SQL,如问题所示。

UPDATE t
SET UPDATE=ISNULL(minyear.[MinYear],Year)
FROM Table t
LEFT JOIN (
    SELECT ID,OBJECT,MIN(YEAR) [MinYear]
    FROM TABLE
    GROUP BY ID,OBJECT
) minyear on minyear.ID=t.ID
    AND minyear.OBJECT=t.OBJECT

答案 1 :(得分:1)

如果您使用的是SQL Server 2012+,则可以使用LAG获取之前的值:

;WITH ToUpdate AS (
   SELECT ID, YEAR, OBJECT, [UPDATE], 
          COALESCE(LAG(YEAR) OVER (PARTITION BY OBJECT 
                                   ORDER BY YEAR, ID), 
                   YEAR) AS prevYear 
   FROM mytable
)
UPDATE ToUpdate
SET [UPDATE] = prevYear

CTE上执行的更新将传播到真实数据库表。因此,UPDATE操作会使用前一条记录的值填充[UPDATE]字段。

注意:LAG获取上一行行的YEAR值,由ORDER BY YEAR, ID子句定义。如果没有先前的值,则[UPDATE]设置为等于同一记录的YEAR值。

Here