我有一个表,我想从中选择单行的行ID,但是按特定的顺序。然后,我想循环遍历该列,如下所示:
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中执行此操作?
答案 0 :(得分:1)
您可以使用光标,也可以使用更智能的东西。
你的例子应该能够很容易地写成:
update mytable set nextID = LEAD(id,1) over (order by id)
Lead(id,1)将获取记录集中前一行的下一个id,并用它更新nextID字段。如果它找不到它,它将返回null。不需要循环或条件逻辑!
编辑:我忘记了over子句。这部分告诉它你如何订购铅
答案 1 :(得分:1)
由于你没有提供很多细节,让我们假装你的表看起来像这样:
create table MyTable (
Id int not null primary key,
Name varchar(50) not null,
NextId int
)
我想只从中选择一列行ID, 但按特定顺序
我们只想说在这种情况下,您决定按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
,但在您的情况下可能还有其他内容。