我有一个表,我想只从中选择行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子句。这部分告诉它你想要的标题顺序