我如何迭代SQL结果,如for循环和数组



我有一个表,我想只从中选择行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中有这样的方法吗?

由于您没有提供太多细节,让我们假设您的表看起来像这样:

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,但它可能是其他的东西在你的情况下。

您可以使用光标,或者您可以使用更聪明的东西。

您的示例应该能够相当容易地按照以下行编写:

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

Lead(id,1)将获取记录集中前面1行的下一个id,并用它更新nextID字段。如果找不到,它将返回null。不需要循环或条件逻辑!

我忘记了over子句。这部分告诉它你想要的标题顺序

最新更新