递归SQL查询 - 使用查询中的查询结果

时间:2012-12-23 21:42:53

标签: sql sql-server-2012

我正在运行SQL Server 2012,这就是我需要的:

Row      Field1          Field2
 1         0               1
 2         ?               2
 3         ?               -5

我需要一个逐行抛出的查询。 它应该采用row2,field1并将其设置为等于row1,field1 + row2,field2

然后它将采用row3,field1并将其设置为等于row2,field1 + row3,field2

最初,表中的Field1中的值都等于0,因此当我运行查询时,它总是使用0作为field1值。

任何帮助将不胜感激。我在想CTE是可行的方法,但我不知道该怎么做。

编辑: 在我的例子中,只是为了清理一些事情。初始输入是

Row      Field1          Field2
 1         0               1
 2         0               2
 3         0               -5

所需的输出是:

Row      Field1          Field2
 1         1               1
 2         3               2
 3         -2               -5 

我的实际表格有点复杂,但我知道我可以专门应用它,如果我能理解如何通过这个例子来解决它。

2 个答案:

答案 0 :(得分:3)

这是你需要的吗? (不清楚当你引用row2时,例如field1是指更新值之前或之后)

CREATE TABLE YourTable
  (
     Row    INT,
     Field1 INT NULL,
     Field2 INT
  )

INSERT INTO YourTable
VALUES      (1,0,1),
            (2,0,2),
            (3,0,-5); 
WITH CTE AS
(
SELECT *,
       SUM(Field2) OVER (ORDER BY Row ROWS UNBOUNDED PRECEDING) AS RunningTotal
FROM  YourTable    
)
UPDATE CTE 
SET Field1 = RunningTotal

SELECT *
FROM YourTable

最终结果

Row         Field1      Field2
----------- ----------- -----------
1           1           1
2           3           2
3           -2          -5

或者对你的单词问题的另一种(更直接的)解释可能是

WITH CTE AS
(
SELECT *,
       LAG(Field2) OVER (ORDER BY Row) AS PrevRowField2
FROM  YourTable    
)
UPDATE CTE 
SET Field1 = PrevRowField2 + Field1
WHERE PrevRowField2 IS NOT NULL

答案 1 :(得分:1)

这样的改编自TSQL A recursive update?

With cte As (
  Select
    Row, 
    Field1, 
    Field2
  From
    t
  Where
    Row = 1
  Union All
  Select
    t.Row,
    t.Field2 + c.Field1,
    t.Field2
  From
    t
      Inner Join
    cte c
      On t.Row = c.Row + 1
)
Update
  t
Set
  Field1 = c.Field1
From
  t
    inner join
  cte c
    On t.Row = c.Row

http://sqlfiddle.com/#!6/cf843/1