使用下一条记录的数据更新 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 个候选键,DomainID
和 PersonID
。
【参考方案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 表中除一条重复记录外的所有重复记录