游标用前一行和当前行的值更新行
各位查询编写者,
我有一个如下表:
myTable t1
col2 col3
2 1
3 0
4 0
5 0
6 0
我想用前一行中 col3 的值加上当前行中 col2 的值来更新 col3 上的每个零。所以我的桌子会像下面这样:
myTable t1
col2 col3
2 1
3 4 (1+3)
4 8 (4+4)
5 13 (5+8)
6 19 (6+13)
我错过了这里的逻辑,也许是短视。我用光标尝试如下:
DECLARE @var3 FLOAT
DECLARE cursor3 CURSOR FOR
SELECT col2, col3 FROM table1
FOR UPDATE OF col3
OPEN cursor3
FETCH FIRST FROM cursor3
WHILE (@@FETCH_STATUS > -1)
BEGIN
UPDATE @table1
SET col3 = isnull(@var3, 0) + isnull(col2, 0)
WHERE CURRENT OF cursor3
FETCH NEXT FROM cursor3 INTO @var3
END
但这是错误的。 有什么想法吗?
提前致谢。
Fellow Query Writers,
I have a table as follows:
myTable t1
col2 col3
2 1
3 0
4 0
5 0
6 0
and I want to update each zero on col3 with the value of col3 in the previous row plus the value of col2 in the current row. So my table would de like the following:
myTable t1
col2 col3
2 1
3 4 (1+3)
4 8 (4+4)
5 13 (5+8)
6 19 (6+13)
I'm missing the logic here, short-sightedness perhaps. I was trying it with a cursor as follows:
DECLARE @var3 FLOAT
DECLARE cursor3 CURSOR FOR
SELECT col2, col3 FROM table1
FOR UPDATE OF col3
OPEN cursor3
FETCH FIRST FROM cursor3
WHILE (@@FETCH_STATUS > -1)
BEGIN
UPDATE @table1
SET col3 = isnull(@var3, 0) + isnull(col2, 0)
WHERE CURRENT OF cursor3
FETCH NEXT FROM cursor3 INTO @var3
END
but it's wrong.
Any ideas?
Thanks in advance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
好的,试试这个。
使用
WHILE
循环,在大多数情况下它应该比光标更快。OK, Try this.
Uses a
WHILE
loop which should be faster than a cursor under most circumstances.我在表中添加了一个标识列,最终使用了这样的代码:
它解决了我的问题。谢谢大家。
I added an identity column to my table and ended up using a code like this:
It solved my problem. Thank you all.
下面是一个使用公用表表达式 (CTE) 更新数据的 UPDATE 语句。
Here is a single UPDATE statement that uses common table expressions (CTE) to update the data.
FWIW 使用 CURSOR 的主要且令人信服的原因是,如果不这样做,会对您的 RDBMS 造成太大的影响。您几乎总是可以使用 WHILE 循环来代替 CURSOR;一次处理一条记录;当您出于某种原因可能需要迭代大量记录时,它会非常有用... CURSOR 操作比等效的 SET 操作的效率呈指数级提高。
所以总的来说,这取决于速度和速度。开销与效率...
游标几乎是最慢的方式,但开销最小,即使在 MSSQL 2012 中仍然有用...
FWIW The major, compelling reason to use a CURSOR is when not doing so, will put too much of a hit on your rdbms. You can almost always use a WHILE loop instead of a CURSOR; processing ONE record at a time; can be quite useful when for whatever reason you may need to iterate a large number of records... CURSOR operations are exponentially more efficient than the equivalent SET operation.
So in general it comes down to speed & overhead vs. efficiency...
CURSORS are pretty much the slowest way to go, but have the least amount of overhead and are still useful even in MSSQL 2012 ...