使用下一条记录的数据更新 SQL Server 单元格数据

Posted

技术标签:

【中文标题】使用下一条记录的数据更新 SQL Server 单元格数据【英文标题】:Update SQL Server cell data with the data of next record 【发布时间】:2012-09-28 10:32:59 【问题描述】:

我必须更新我的一个错误更新的 SQL Server 表的数据,这导致一行单元格的数据覆盖下一个单元格。以下是表格应该处于正确状态的示例:

FirstName      LastName     EmailID
--------------------------------------------------
abc            xyz          abc.xyz@something.com
def            321          def.321@something.com
ghi            123          ghi.123@something.com

错误的数据变成了:

FirstName   LastName    EmailID
---------------------------------------------
abc         xyz         something
def         321         abc.xyz@something.com
ghi         123         def.321@something.com

我知道最后一条记录将找不到,但至少应该正确恢复其他记录

【问题讨论】:

什么是主键?只有 EmailID 需要更新吗? 欢迎使用 ***:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ( ) 在编辑器工具栏上很好地格式化和语法高亮它!这样,您也不需要任何凌乱的  标签! 为了回答这个问题,您需要提供关键字段。 SQL 在表中没有 next 的原生概念,您可以使用主键创建该概念。 该表没有主键。虽然,有 2 个候选键,DomainIDPersonID 【参考方案1】:

假设您的表格是按名、姓排序的,您可以使用这个:

declare @contact as table (firstName varchar(255), lastName varchar(255), emailID varchar(255))
insert into @contact (firstName, lastName, emailID)
values
    ('abc', 'xyz', 'something')
    ,('def', '321', 'abc.xyz@something.com')
    ,('ghi', '123', 'def.321@something.com');


with contactCTE(rowNo, firstName, lastName, emailID) 
as
(
    select 
        ROW_NUMBER() OVER (ORDER BY firstName, lastName DESC)
        ,firstName 
        ,lastName 
        ,emailID 
    from
        @contact 
)
update c1   
set
    emailID = c2.emailID 
from 
    contactCTE c1
    inner join contactCTE c2 on c1.rowNo +1 = c2.rowNo;

select * from  @contact     

如果您的数据排序不同,只需修改 contactCTE 中的 ORDER BY 部分以反映这一点

【讨论】:

以上是关于使用下一条记录的数据更新 SQL Server 单元格数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 中第一条记录结束日期和下一条记录开始日期之间的重叠

更新 SQL Server 表中除一条重复记录外的所有重复记录

通过 SQL 读取下一条/上一条记录

关于查询sql中数据上一条记录和下一条记录的sql语句......

如何获取SQL查询当前数据上一条和下一条的记录?

02 | 日志系统:一条SQL更新语句是如何执行的?