通过在不同的表中查找来更新 SQL 中的记录
Posted
技术标签:
【中文标题】通过在不同的表中查找来更新 SQL 中的记录【英文标题】:Update records in SQL by looking up in different table 【发布时间】:2020-05-12 23:39:16 【问题描述】:我正在将 SQL 服务器 A 中的几个表中的数据复制到 B。我在 B 中有一组临时表,需要根据 B 中最终目标表中的更新值更新其中一些临时表。
例子:
服务器 B:
暂存表1:
ID | NAME | CITY
1 ABC XYZ
2 BCD XXX
StagingTable2:
ID | AGE | Table1ID(FK)
10 15 1
20 16 2
将 StagingTable1 复制到 TargetTable1 后(ID 被自动填充,我得到新的 ID,现在 ID 1 变为 2,ID 2 变为 3)
目标表1:
ID | NAME | CITY
1 PQR YYY (pre-existing record)
2 ABC XYZ
3 BCD XXX
所以现在在我可以复制 StagingTable2 之前,我需要用 TargetTable1 中的正确值更新其中的 Table1ID 列。
StagingTable2 应该变成:
ID | AGE | Table1ID(FK)
10 15 2
20 16 3
我正在为此编写一个存储过程,但不确定如何查找和更新临时表中的记录?
【问题讨论】:
请用您正在使用的数据库标记您的问题:mysql、oracle、sql-server...? 到目前为止你尝试了什么? 向我们展示您的尝试并解释您遇到的问题。 【参考方案1】:假设(name, city)
元组在StagingTable1
和TargetTable1
中是唯一的,您可以使用可更新的公用表表达式来生成新的映射并分配相应的值:
with cte as (
select st2.Table1ID, tt1.id
from StagingTable2 st2
inner join StagingTable1 st1 on st1.ID = st2.Table1ID
inner join TargetTable1 tt1 on tt1.name = st1.name and tt1.city = st1.city
)
update cte set Table1ID = id
Demo on DB Fiddle - StagingTable2
在update
之后的内容:
【讨论】:
以上是关于通过在不同的表中查找来更新 SQL 中的记录的主要内容,如果未能解决你的问题,请参考以下文章