【问题标题】:Copy related rows from two tables into those same tables with new values in SQL?将两个表中的相关行复制到 SQL 中具有新值的相同表中?
【发布时间】:2021-07-07 15:12:48
【问题描述】:

我有两个表,“table1”和“table2”。它们包含彼此相关的行。表“table2”有成对的行和名为“table1_id”的列,这些对引用“table1”中连续的“id”列。

需要执行的任务是我需要从两个表中复制行并将这些行放入具有新数据的同一个表中,同时保持它们之间的关系。

我已经阅读了 StackOverflow 上的几篇文章和“mssqltips.com”上的一些文章,但我仍然不确定我应该如何做到这一点。我应该使用带有连接和临时表的游标还是查询?完成上述任务的最佳实践方法是什么?如果可能,您能否演示一个简短的示例?

【问题讨论】:

  • 您可能需要使用INSERT INTO ... SELECT ... table1 JOIN table2 类型的查询。但最好展示您已经尝试过的方法,以便人们可以纠正并找到解决方案。
  • 但这不足以维持列之间的基于对的关系。我可以整天选择、插入和执行连接,但这是我以前从未遇到过的独特情况。问题是维护table2中的列和table1的主键Id coumn之间的关系。

标签: sql sql-server


【解决方案1】:

如果 id 列被复制并且确实是一个 ID(唯一键),则您不能逐字“复制两个表中的两行并将它们放入同一个表中”。如果您想将其他一些(非键)列复制到具有新 ID 的新行中,那很好。如果这是您想要的,您可以先创建主键 (table1) 行,然后引用新创建的键。如何执行此操作取决于 id 列是生成的还是明确指定的键,以及 table2 中是否还有任何键(主键或外键)。

它可能看起来像这样:

insert into table1
select col1, col2, etc
from table1
where id = 'somekey'

insert into table2
select 'newkey' as table1_id, col3, col4, etc
from table2
where table1_id = 'somekey'

如果您想以原子方式执行此操作,请将其包装在 begin transaction 中,并使用 OUTPUT 子句或类似的子句来收集新 ID;请参阅documentation

【讨论】:

  • 请注意,不需要游标或临时表,尽管您可以根据您的架构使用连接,如果您选择使用表变量或临时表,OUTPUT 可以使用表变量或临时表实施它。
  • 感谢您的意见。 “table1”中的“id”没有被复制,它们只是收到一个新值。问题是我需要从“table2”复制的行中的“table1_id”列来匹配“table1”中复制的行中的这些新的“id”列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 2014-07-14
相关资源
最近更新 更多