Sql server 循环SQL Server中的表并更新特定计数索引处的列
我正在尝试使用列下面的值更新列值,我正在使用循环来尝试实现这一点。请参阅我尝试更新的字段的屏幕截图 i、 我正试图将第二行的细节更新为第一行的参考Sql server 循环SQL Server中的表并更新特定计数索引处的列,sql-server,database,tsql,Sql Server,Database,Tsql,我正在尝试使用列下面的值更新列值,我正在使用循环来尝试实现这一点。请参阅我尝试更新的字段的屏幕截图 i、 我正试图将第二行的细节更新为第一行的参考 DECLARE@CTRw INT 设置为@CTRw=2 而@CTRw我知道铅可能是答案。但我总是使用ID+1上的自连接来实现这一点 我知道你在做什么,这将无需循环即可完成: 步骤1-使用下一行更新引用: Update main set Reference = left(next.Details,50) from SBSA_Loaded main j
DECLARE@CTRw INT
设置为@CTRw=2
而@CTRw我知道铅可能是答案。但我总是使用ID+1上的自连接来实现这一点
我知道你在做什么,这将无需循环即可完成:
步骤1-使用下一行更新引用:
Update main
set Reference = left(next.Details,50)
from SBSA_Loaded main
join SSBA_Loaded next on main.ID+1=next.ID
步骤2-删除偶数行:
Delete from SBSA_Loaded
where ID % 2 = 0 --MOD looks at the remainder of division
我知道答案可能在这里。但我总是使用ID+1上的自连接来实现这一点
我知道你在做什么,这将无需循环即可完成:
步骤1-使用下一行更新引用:
Update main
set Reference = left(next.Details,50)
from SBSA_Loaded main
join SSBA_Loaded next on main.ID+1=next.ID
步骤2-删除偶数行:
Delete from SBSA_Loaded
where ID % 2 = 0 --MOD looks at the remainder of division
您可以使用modus%
和lead
declare @T table (pk int identity primary key, descr varchar(20), val
varchar(20));
insert into @T (descr) VALUES ('odd description'), ('even description'), ('odd description'), ('even description'), ('odd description'), ('even description'), ('odd description')
, ('even description'), ('odd description'), ('even description'), ('odd description'), ('even description'), ('odd description'), ('even description')
, ('odd description'), ('even description'), ('odd description'), ('even description'), ('odd description'), ('even description'), ('odd description');
select *
, pk % 2 as modus
from @T t;
with cte as
( select *
, lead(descr) over (order by pk) as leadDescr
from @T t
)
update t
set val = LEFT(leadDescr, 4)
from CTE t
where pk % 2 = 1;
select *
from @T t;
pk descr val modus
----------- -------------------- -------------------- -----------
1 odd description NULL 1
2 even description NULL 0
3 odd description NULL 1
4 even description NULL 0
5 odd description NULL 1
6 even description NULL 0
7 odd description NULL 1
8 even description NULL 0
9 odd description NULL 1
10 even description NULL 0
11 odd description NULL 1
12 even description NULL 0
13 odd description NULL 1
14 even description NULL 0
15 odd description NULL 1
16 even description NULL 0
17 odd description NULL 1
18 even description NULL 0
19 odd description NULL 1
20 even description NULL 0
21 odd description NULL 1
pk descr val
----------- -------------------- --------------------
1 odd description even
2 even description NULL
3 odd description even
4 even description NULL
5 odd description even
6 even description NULL
7 odd description even
8 even description NULL
9 odd description even
10 even description NULL
11 odd description even
12 even description NULL
13 odd description even
14 even description NULL
15 odd description even
16 even description NULL
17 odd description even
18 even description NULL
19 odd description even
20 even description NULL
21 odd description NULL
您可以使用modus%
和lead
declare @T table (pk int identity primary key, descr varchar(20), val
varchar(20));
insert into @T (descr) VALUES ('odd description'), ('even description'), ('odd description'), ('even description'), ('odd description'), ('even description'), ('odd description')
, ('even description'), ('odd description'), ('even description'), ('odd description'), ('even description'), ('odd description'), ('even description')
, ('odd description'), ('even description'), ('odd description'), ('even description'), ('odd description'), ('even description'), ('odd description');
select *
, pk % 2 as modus
from @T t;
with cte as
( select *
, lead(descr) over (order by pk) as leadDescr
from @T t
)
update t
set val = LEFT(leadDescr, 4)
from CTE t
where pk % 2 = 1;
select *
from @T t;
pk descr val modus
----------- -------------------- -------------------- -----------
1 odd description NULL 1
2 even description NULL 0
3 odd description NULL 1
4 even description NULL 0
5 odd description NULL 1
6 even description NULL 0
7 odd description NULL 1
8 even description NULL 0
9 odd description NULL 1
10 even description NULL 0
11 odd description NULL 1
12 even description NULL 0
13 odd description NULL 1
14 even description NULL 0
15 odd description NULL 1
16 even description NULL 0
17 odd description NULL 1
18 even description NULL 0
19 odd description NULL 1
20 even description NULL 0
21 odd description NULL 1
pk descr val
----------- -------------------- --------------------
1 odd description even
2 even description NULL
3 odd description even
4 even description NULL
5 odd description even
6 even description NULL
7 odd description even
8 even description NULL
9 odd description even
10 even description NULL
11 odd description even
12 even description NULL
13 odd description even
14 even description NULL
15 odd description even
16 even description NULL
17 odd description even
18 even description NULL
19 odd description even
20 even description NULL
21 odd description NULL
阅读LEAD()
和LAG()
。一般来说:尽可能避免循环…提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如,sql-server-2014
)标记数据库问题很有帮助。语法和特征的差异通常会影响答案。请注意,tsql
缩小了选择范围,但没有指定数据库。@Shnugo感谢它做了这个把戏,从不知道那些函数。@Shnugo感谢它做了这个把戏,从不知道那些函数。阅读关于LEAD()
和LAG()
。一般来说:尽可能避免循环…提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如,sql-server-2014
)标记数据库问题很有帮助。语法和特征的差异通常会影响答案。请注意,tsql
缩小了选择范围,但没有指定数据库。@Shnugo感谢它做了这个把戏,从不知道那些函数。@Shnugo感谢它做了这个把戏,从不知道那些函数。LEAD()和LAG()可能不适用于所有环境,因此最好知道如何以其他方式执行此操作。其中main.Page=1
如果您不能依赖无间隙数字,则可以放置一个CTE
首先调用行号()
按现有ID排序,并将此CTE用作自连接的源代码。LEAD()并且LAG()可能不适用于所有环境,因此知道如何用其他方法来实现仍然很好。WHERE main.Page=1
如果您不能依赖无间隙数字,您可以在第一次调用ROW_NUMBER()时放置一个CTE
按现有ID排序,并将此CTE用作您的自连接
构造的源。