如何执行更新并在一个查询中插入多个ID

问题描述 投票:0回答:1

曾经,我需要对从表中的select返回的所有外键值执行复杂的修改(使用给定的外键更新所有行,并插入具有相同外键和一些新值的新行),其中这些值是主键。

这是一个“只做一次”的情况,不用于编码。

因此,我编写了以下脚本:使用update和insert声明一个存储过程,在select上声明一个快进光标,然后对获取的每个ID执行该过程,最后删除该过程。但是,我几乎可以肯定,还有更好的方法。

如果再次发生这种情况,您会提出什么建议?

P.S。 MS SQL Server 2005。

P.P.S。更新和选择处于这样的关系中,即满足选择条件的行在更新后不再满足那些条件。

UPD:

例如:

将要修改的表UserLog(混淆实际的列名和值):

[…,user_Id:25,日期:01.01.1654,check_life_signs:0],

[…,user_Id:47,日期:05.05.1717,check_life_signs:0],

[…,user_Id:25,日期:01.01.998,check_life_signs:1],

[…,user_Id:54,日期:2019年12月10日,check_life_signs:0],

需要:

1. Select distinct Id from User join UserLog on User.Id = UserLog.user_Id 
where User.IsVampire = 1 and UserLog.check_life_signs = 0 and UserLog.date < 
(some date given)
2. For all such Id: UPDATE UserLog Set check_life_signs = 1; INSERT INTO 
UserLog (user_Id, date, check_life_signs) VALUES (id found), GETDATE(), 0

因此,在此过程之后,如果user_Id = 54不是吸血鬼,则表UserLog将变为:

[…,user_Id:25,日期:01.01.1654,check_life_signs:1],

[…,user_Id:47,日期:05.05.1717,check_life_signs:1],

[…,user_Id:25,日期:01.01.998,check_life_signs:1],

[…,user_Id:54,日期:2019年12月10日,check_life_signs:0],

[…,user_Id:25,日期:12.10.2019,check_life_signs:0],

[…,user_Id:47,日期:12.10.2019,check_life_signs:0],

sql sql-server
1个回答
0
投票

尝试在下面的查询中获得预期的结果-

第1步-在临时表中选择并存储ID,该表需要用于更新和插入用户日志表] >>

select * into #tempUser
From
(Select distinct id from [User] inner join UserLog on [User].Id = UserLog.user_Id 
where [User].IsVampire = 1 and UserLog.check_life_signs = 0 and UserLog.date < getdate()) a

步骤2-更新UserLog表

Update UserLog
Set check_life_signs = 1
From UserLog ul inner join #tempUser on ul.user_Id = #tempUser.Id; 

步骤3-插入到UserLog表中

INSERT INTO UserLog 
(user_Id, date, check_life_signs) 
Select id, GETDATE(), 0 from #tempUser;

步骤4-删除温度表

Drop table #tempUser
© www.soinside.com 2019 - 2024. All rights reserved.