表未在单选查询中更新

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。我认为不需要递归。 这不是我的问题的解决方案,请检查上面 表一样,更新中选择

以上是关于表未在单选查询中更新的主要内容,如果未能解决你的问题,请参考以下文章

启用转到下一步按钮,尝试设置状态并在单选按钮中创建新的 onclick 方法

SmartClient:在单选项目之间插入控件

ReactJS:如何在单选按钮中使用布尔值?

如何在单选按钮后显示验证消息?

.click() 在单选按钮上不起作用

在单选按钮列表的标签内呈现输入类型单选