【问题标题】:How to insert the data of a subset table into a superset table using select statement?如何使用 select 语句将子集表的数据插入超集表?
【发布时间】:2020-10-11 16:40:20
【问题描述】:

我正在尝试进行动态查询,我想将数据从子集表插入到超集表中。

这是我的桌子

Table A
|---------------------|------------------|
|          id         |  EmployeeName    |
|---------------------|------------------|
|           1         |       ABC1       |
|---------------------|------------------|
|           2         |       ABC2       |
|---------------------|------------------|
|           3         |       ABC3       |
|---------------------|------------------|

Table B
|----------------------|---------------------|------------------|
|          id          |       empid         |  EmployeeName    |    
|----------------------|---------------------|------------------|
|                      |                     |                  |
|----------------------|---------------------|------------------|
|                      |                     |                  |
|----------------------|---------------------|------------------|
|                      |                     |                  |
|----------------------|---------------------|------------------|

我想将A表的数据插入B表

这是我正在尝试的查询

insert into B (select * from A); 

它不起作用并显示两个表的列数不相等。

【问题讨论】:

  • 您使用的是 MySQL 还是 Oracle?为什么必须是存储过程?
  • @jarih 我正在使用 MySQL,我正在尝试在存储过程中实现此逻辑。

标签: mysql sql database stored-procedures


【解决方案1】:

默认情况下,insert 语句要求提供所有目标列。您可以通过枚举要插入的列来更改它。这是一个您应该坚持的好习惯,因为它使查询更易于阅读和维护。

大概,你想要:

insert into b(id, employeeName)
select id, employeeName
from a

【讨论】:

  • 是的,但正如我提到的,我想创建一个动态查询,我不需要提及列名,以便它适用于一组以上的表。
【解决方案2】:

您需要映射列,以便它们可以匹配。 See documentation

试试这个:

insert into B (id, EmployeeName) select id, EmployeeName from A; 

【讨论】:

  • 是的,但正如我提到的,我想创建一个动态查询,我不需要提及列名,以便它适用于一组以上的表。
【解决方案3】:

Insert into B(id, EmployeeName) values(select * from A); //只有在 empid 上没有设置 notNull 约束时才有效。

对于这种情况,这是您可以拥有的最动态的查询。 我们提到了表 B 的列名,因为您只提供了 2 列的值。 如果您不想使用列名,则需要在其他表中保留剩余数据并稍微修改表 B。

表 A |----------------------|------------------| |编号 |员工姓名 | |----------------------|------------------| | 1 | ABC1 | |----------------------|------------------| | 2 | ABC2 | |----------------------|------------------| | 3 | ABC3 | |----------------------|------------------| 表 B |----------------------|----------|---- --------------| |编号 |员工姓名 |空 | |----------------------|----------|---- --------------| | | | | |----------------------|----------|---- --------------| | | | | |----------------------|----------|---- --------------| | | | | |----------------------|----------|---- --------------| 表 C |----------------------|------------------| |编号 |空 | |----------------------|------------------| | 1 | 1000 | |----------------------|------------------| | 2 | 1001 | |----------------------|------------------| | 3 | 1002 | |----------------------|------------------|

现在您可以运行查询: insert into B values(select * from A inner join C on A.id=C.id); 这将填充您的表 A。

【讨论】:

    【解决方案4】:

    这是对我有用的最终解决方案,因为 Id 是一个自动递增列,如果您在其中输入 null,则不会发生任何变化。

    INSERT INTO B (SELECT NULL, A.* FROM A);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      相关资源
      最近更新 更多