Sql 插入上一行
我有下表:Sql 插入上一行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有下表: DECLARE @TempTable TABLE ( ID int, Lastname nvarchar(50), Firstname nvarchar(50), Age int ) insert into @TempTable (ID, Lastname, Firstname, Age) VALUES(1, 'Smith', NULL, NULL), (2, NULL, 'Will', 40), (3, NULL, 'Jaden',
DECLARE @TempTable TABLE
(
ID int,
Lastname nvarchar(50),
Firstname nvarchar(50),
Age int
)
insert into @TempTable (ID, Lastname, Firstname, Age)
VALUES(1, 'Smith', NULL, NULL),
(2, NULL, 'Will', 40),
(3, NULL, 'Jaden', 20),
(4, 'Matt', NULL, NULL),
(5, NULL, 'Damon', 39)
我想使用“更新”更改表,如下所示:
我知道函数“滞后”和“超前”。但据我所知,它们不能用于更新表达式这里有一个使用相关子查询的选项:
Microsoft SQL解决方案
小提琴:
示例:您还可以通过递归CTE获得这些结果 例如:
我们可以问一下,为什么您有如此零碎的数据吗?如果没有将所有记录关联在一起的主/组列,则您请求的查询可能会非常繁重或费力。此数据是否已存在于表中?看起来你需要修复它,而不是事后更新,除非这是你在一次性工作中要做的。我知道函数“滞后”和“超前”。但是据我所知,它们不能用在更新表达式中,这不太正确,你可以,只是不能用在UPDATE子句本身。例如,您可以使用CTE。不过,滞后和领先对你没有帮助,这更接近于一个差距和孤岛问题。再加上其他人说的话——比如说,有人因为结婚需要更改姓氏。您将如何将其整合到这样的数据结构中?@Tibomso。更新不会更改表中的行数。你可能会考虑合并——你可以在更新中使用滞后和超前,但这似乎与你想要做的事情并不直接相关。
update t
set lastname = (select top 1 lastname
from @TempTable t2
where t2.lastname is not null and
t.id > t2.id
order by t2.lastname)
from @TempTable t
where firstname is not null;
delete from @TempTable
where firstname is null;
select * from @TempTable;
select id ,
(
select Lastname from @TempTable c where c.ID < p.id AND c.Lastname is not null group by Lastname
order by max(id) desc OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
) as Lastname,
FirstName,
Age
from @TempTable p
where Firstname is not null;
DECLARE @TempTable TABLE
(
ID int,
Lastname nvarchar(50),
Firstname nvarchar(50),
Age int
)
insert into @TempTable (ID, Lastname, Firstname, Age) values
(1, 'Smith', NULL, NULL),
(2, NULL, 'Will', 40),
(3, NULL, 'Jaden', 20),
(4, 'Matt', NULL, NULL),
(5, NULL, 'Damon', 39);
;with RCTE AS
(
select ID, LastName, ID AS [NewID], LastName as NewLastName
from @TempTable
where LastName IS NULL
union all
select r.ID, r.LastName, t.ID, t.LastName
from RCTE r
join @TempTable t on t.ID = r.[NewID] - 1
where r.NewLastName is null
)
update t
set LastName = RCTE.NewLastName
from @TempTable t
join RCTE on (RCTE.ID = t.ID and RCTE.NewLastName IS NOT NULL);
delete
from @TempTable
where FirstName is null;
select *
from @TempTable
order by ID;