【问题标题】: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 中的问题

标签: sql sql-server sql-update case sql-insert


【解决方案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。我认为不需要递归。
  • 这不是我的问题的解决方案,请检查上面
  • 表一样,更新中选择
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2015-02-02
相关资源
最近更新 更多