如何像for循环和数组一样迭代SQL结果?

时间:2015-08-27 01:30:26

标签: sql sql-server

我有一个表,我想从中选择单行的行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中执行此操作?

2 个答案:

答案 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,但在您的情况下可能还有其他内容。