【问题标题】:inserting data from multiple tables into one table将多个表中的数据插入到一个表中
【发布时间】:2013-01-13 15:46:55
【问题描述】:

我正在尝试使用下面的这个 SQl 将表中的数据添加到一个表中:

INSERT INTO myNewTable
SELECT *
FROM 2010-tbl, 2011-tbl, 2013-tbl
WHERE fldName = 'value';

所有表都具有完全相同的结构 - 但每个表中的值不同。第一个表(myNewTable)没有值,将接受其他表插入的所有值。那么我该怎么做呢?我需要某种 JOIN 语句吗?

编辑

只有一件事 - 我试图在插入之前删除其中的先前记录 - 但 MS Access 抛出此错误:

Characters found after end of SQL statement

这是代码:

DELETE * FROM myNewTable
INSERT INTO myNewTable
SELECT * FROM 2012-tbl WHERE  (((2012-tbl.[field])=[Text]));

谢谢

【问题讨论】:

  • 尝试不带 id 的 select 语句,相同的 id 可能会阻止插入。

标签: mysql ms-access ms-access-2003


【解决方案1】:

在您的 SELECT 声明中使用 Union

INSERT INTO myTable 
SELECT * 
FROM 2010-tbl 
WHERE fldName = 'value'
UNION
SELECT * 
FROM 2011-tbl 
WHERE fldName = 'value'
UNION
SELECT * 
FROM 2013-tbl 
WHERE fldName = 'value'

【讨论】:

    【解决方案2】:

    你正在寻找工会

    http://dev.mysql.com/doc/refman/5.0/en/union.html

    INSERT INTO myNewTable
    (
      SELECT *
      FROM 2010-tbl
      WHERE fldName = 'value';
    ) UNION (
      SELECT *
      FROM 2011-tbl
      WHERE fldName = 'value';
    ) UNION (
      SELECT *
      FROM 2013-tbl
      WHERE fldName = 'value';
    )
    

    【讨论】:

    • 这导致笛卡尔积,也许你的意思是SELECT * FROM 2010-tbl WHERE fldName = 'value' UNION SELECT * FROM 2011-tbl WHERE fldName = 'value' ....
    【解决方案3】:

    执行此操作的简单方法是将 UNION ALLSELECT 一起使用。 如果要消除重复行,请使用 UNION 而不是 UNION ALL。

    DELETE * FROM   mynewtable;
    
    INSERT INTO mytable 
    SELECT * FROM 2010-tbl WHERE fldname = 'value' 
    UNION ALL 
    SELECT * FROM 2011-tbl WHERE fldname = 'value' 
    UNION ALL 
    SELECT * FROM 2012-tbl WHERE  fldname = 'value';
    

    如果这些表的记录数较少,这可以正常工作,但如果这些表包含大量记录,则会出现 与堆内存相关的错误。 为避免这种情况,您可以使用以下模块化 sn-p 来完成您的工作!

    DELETE * FROM mynewtable;
    
    INSERT INTO mytable SELECT * FROM 2010-tbl WHERE fldname = 'value';
    
    INSERT INTO mytable SELECT * FROM 2011-tbl WHERE fldname = 'value';
    
    INSERT INTO mytable SELECT * FROM 2012-tbl WHERE fldname = 'value';
    

    如果你有太多的表,那么使用上面(第二种方式)可能会很耗时,因为你必须一个一个地输入每个命令,所以为了方便你可以把这个代码 sn-p 放在一个文本文件中,然后使用 source 命令一次运行这些命令。示例:

    1. 创建名为 allCommands 的文件并将这些命令放入 它: $ cat > allCommands 从 mynewtable 中删除 *;

      INSERT INTO mytable SELECT * FROM 2010-tbl WHERE fldname = 'value';
      
      INSERT INTO mytable SELECT * FROM 2011-tbl WHERE fldname = 'value';
      
      INSERT INTO mytable SELECT * FROM 2012-tbl WHERE fldname = 'value';
      
    2. 从终端/cmd启动mysql

      shell> mysql
      
    3. 使用 source 命令运行此脚本。 别忘了提供 allCommands 文件的正确路径。

      mysql> use db_name;
      mysql> source allCommands;
      

    【讨论】:

      猜你喜欢
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      相关资源
      最近更新 更多