表未在单选查询中更新
Posted
技术标签:
【中文标题】表未在单选查询中更新【英文标题】:Table not updating in single select query 【发布时间】:2020-08-28 18:30:25 【问题描述】:我有一个临时表需要更新,第一行已更新,但第二行更新为 null ,请帮助
declare @T Table
(
ID int,
Name nvarchar(20),
rownum int
)
insert into @T(ID,rownum)
select ID, rownum = ROW_NUMBER() OVER(order by id) from testtabel4
select * from testtabel4
update @t
set Name=case when rownum>1 then (select top 1 Name from @T x where x.rownum=(y.rownum-1))
else 'first' end
from @t y
select * from @T
这里是testtabel4的定义
CREATE TABLE [dbo].[testtabel4](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](80) NULL,
PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
这是输出
身份证名称 1 第一 2 空【问题讨论】:
你为什么要这样做;y.rownum-1
?这看起来像您的UPDATE
中的问题
【参考方案1】:
我认为您的更新最好使用lag()
和可更新的 CTE 编写。
with cte as (
select name, lag(name, 1, 'first') over(order by rownum) lag_name
from @t
)
update cte set name = lag_name
有了这种技术,很明显不需要先喂表,然后再插入表。您可以同时执行这两项操作,如下所示:
insert into @t (id, name, rownum)
select
id,
lag(name, 1, 'first') over(order by id),
row_number() over(order by id)
from testtabel4
我不确定你是否还需要 rownum
列,除非它是出于其他目的需要。
【讨论】:
我需要根据上一行和当前行列的比较来更新下一行,比如我有两列,我更新了第一行的第一列,然后根据这个值我需要要更新下一列,它不可读,我尝试了上面的代码但结果相同。它是否与某些锁定有关,说标记为更新的列不可读? 该解决方案仅在您正在更新的列必须具有 NULL 以外的值时才有效 所有单元格必须有值 值为null时不可更新【参考方案2】:您只在@T
中插入两列:
insert into @T (ID, rownum)
select ID, ROW_NUMBER() OVER (order by id)
from testtabel4;
您没有插入name
,所以它在所有行上都是NULL
。因此,case
表达式的then
部分将始终为NULL
。
【讨论】:
如果我们在一个表中没有 n 行并且第 n-1 行的 A 列由 select 语句更新,现在基于 n-1 列 A,我需要更新列同一选择语句中第 n 列的 A 正在更新 n-1 行的列 A。 select 语句正在从其他表中选择列。希望这能澄清我想要实现的目标。有可能吗? 请指导开发人员 @CuriousDev 。 . .这是通过为每一行分配一个序列号来计算新的rownum
。我认为不需要递归。
这不是我的问题的解决方案,请检查上面
表一样,更新中选择以上是关于表未在单选查询中更新的主要内容,如果未能解决你的问题,请参考以下文章