通过在不同的表中查找来更新 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) 元组在StagingTable1TargetTable1 中是唯一的,您可以使用可更新的公用表表达式来生成新的映射并分配相应的值:

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 - StagingTable2update 之后的内容:

编号 |年龄 |表 1ID -: | --: | --------: 10 | 15 | 2 20 | 16 | 3

【讨论】:

以上是关于通过在不同的表中查找来更新 SQL 中的记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL 更新语句为每个不同的表记录子集填充数字系列

如何通过将一个表中的 id 与另一个表匹配来选择和更新一个表中的记录?

数据库:表的插入,更新表中的数据记录,删除表中的数据记录

通过搜索 SQL Server 中的所有表来查找字符串

如何通过vba查看访问表中的记录集?

如何使用查找的值将记录插入 SQL?