将两个表中的多行插入到一个表中

Posted

技术标签:

【中文标题】将两个表中的多行插入到一个表中【英文标题】:Insert multiple rows from two tables into one table 【发布时间】:2014-09-09 12:30:36 【问题描述】:

我有两张桌子,每张桌子都有很多行。我想将这两个“合并”到另一个表中,我该怎么做呢?

我已经尝试过INSERT INTO SELECT,但它没有做我想做的事情(或者我可能做错了)。

我的桌子是:

Versions
  [version] VARCHAR(10)

Semesters
  [id] INT
  [semester] INT
  [name] VARCHAR(150)

Versions_semesters
  [semesterid] INT
  [version] VARCHAR(10)

版本和学期的一些示例数据:

Versions
  'Version1.0'
  'Version1.5'

Semesters
  1, 15, 'Autumn15'
  2, 15, 'Spring15'
  3, 15, 'Fall15'
  4, 16, 'Autumn16'
  5, 16, 'Spring16'
  6, 16, 'Fall16'

我想要实现的是一个包含与 termIDs 相关的版本的表格。

我可以通过执行以下操作获得我想要的子集:

SELECT id FROM semesters WHERE semester = 16;
SELECT * from Versions;

这两个子集我想INSERT INTO Versions_semesters 所以看起来像这样:

Versions_semesters
  4, 'Version1.0'
  5, 'Version1.0'
  6, 'Version1.0'
  4, 'Version1.5'
  5, 'Version1.5'
  6, 'Version1.5'

有人对此有优雅(或丑陋)的解决方案吗?我想可以使用 CROSS JOIN,因为我已经提取了子集,但是我该如何获取子集然后加入它们?

【问题讨论】:

这些表之间是否存在链接,或者您是否要插入所有可能的组合? 好的,现在我明白了,我发表评论时没有示例,您的目标是拥有所有可能的组合 (CROSS JOIN) 这背后有具体的logic吗?还是随机的? 如果你想编码,那么编码必须有逻辑。如果没有,那么您只能手动选择应该去什么和不应该去什么。 为什么 1.5 版本得到了 ID 1 和 2 的记录,而不是 ID 3?同样,为什么 ID 3 与版本 2.0 匹配,而没有其他记录匹配?如果您不告诉我们,我们怎么知道哪些版本适用于哪些 ID。不幸的是,“所有版本都不适用于所有 ID” 太含糊了。 【参考方案1】:

您正在寻找CROSS JOIN,它是两个表的笛卡尔积。

INSERT INTO Table3
(ID,Version)
SELECT Id,Version
FROM Table1 CROSS JOIN Table2

【讨论】:

谢谢!这使我想到了以下解决方案: 1:声明一个临时表,其中包含我想要的学期 ID 子集。 2:交叉加入带有版本的学期ID。 3:将交叉连接插入versions_semesters 也感谢@Joël Salamin 对您删除的回复!

以上是关于将两个表中的多行插入到一个表中的主要内容,如果未能解决你的问题,请参考以下文章

如何将不同表中的多行插入一个表?

MYSQL 如何把查询到的结果插入到另一个表中?

java怎么将选中的多行数据插入表中

使用 Zend 框架 2 将数据插入和更新到两个表(事务)中

雪花表中json数据的解析字段将多行插入到新的雪花表中

使用存储过程(SQL + C#)将数据插入一个表,然后将多行插入另一个表