2015-08-27 62 views
0

我有一张表,我只想从中选择一列行ID,但是按特定的顺序。然后,我要遍历该列象下面这样:我如何循环访问for循环和数组的SQL结果?

for (i=0; i<rows.length; i++) 
{ 
    if(i==rows.length-1) 
    UPDATE myTable SET nextID = NULL WHERE ID = rows[i] 
    ELSE 
    UPDATE myTable SET nextID = rows[i+1] WHERE ID = rows[i] 
} 

我只是不知道如何与这样的一个索引来访问我的select语句的结果。有没有办法在SQL Server中做到这一点?

+2

你想** [CURSOR](https://msdn.microsoft.com/en-us/library/ms180169.aspx)**,但我强烈建议重新考虑它并找到基于SET的解决方案,而不是基于ROW。循环播放(CURSOR)是最后的手段,当一切都失败时。 – lad2025

+2

在循环内部执行'update'可能是错误的方法。你只想编写一个好的'update'语句。如果显示提取要更新的行的'select'语句,则可以确保您得到准确的答案。 – sstan

+0

这是什么语言?它看起来像PHP?请适当标记。 – Parfait

回答

1

既然你没有提供很多细节,让我们假装你的表看起来像这样的部分:

create table MyTable (
    Id int not null primary key, 
    Name varchar(50) not null, 
    NextId int 
) 

我想从中只选择行标识的单个列,但在一个特定的顺序

远的不说,在这种情况下,你决定订购RO按字母顺序排列由Name。因此,让我们假装要遍历看起来像这样的select声明:

select Id 
    from MyTable 
order by Name 

既然如此,而不是通过行循环,并尝试使用您所提供的伪代码更新每行,你可以用一个update语句将执行完全相同的工作,更换了整个事情:

with cte as (
    select *, 
     NewNextId = lead(Id) over (order by Name) 
    from MyTable 
) 
update cte 
    set NextId = NewNextId 

只要确保调整order by子句无论你特定的顺序确实是。在我的例子中,我只使用了Name,但在你的情况下它可能是别的。

1

你可以使用游标,或者你可以使用一些更聪明的东西。

你的例子应该能够沿的线条很容易写:

update mytable set nextID = LEAD(id,1) over (order by id) 

铅(ID,1)将会获取下一个ID,1排前面的记录集,并更新nextID场用它。如果它找不到一个,它将返回null。不需要循环或条件逻辑!

编辑:我忘了over子句。这是告诉它你会喜欢它订购了铅

+0

只是一个注释导致只适用于SQL 2014及以上。 – Jeremy

+0

啊,好点。 2012年应该也工作:https://msdn.microsoft.com/en-us/library/hh213125(v=sql.110).aspx – LordBaconPants

+0

是的,你是对的。谢谢(你的)信息! – Jeremy