【问题标题】:MySQL How do you INSERT INTO a table with a SELECT subquery returning multiple rows?MySQL 你如何插入一个带有返回多行的 SELECT 子查询的表?
【发布时间】:2012-03-14 10:01:46
【问题描述】:

MySQL 如何插入带有返回多行的 SELECT 子查询的表?

  INSERT INTO Results
    (
     People,
     names,
    )
    VALUES
    (
     (
       SELECT d.id
       FROM Names f
       JOIN People d ON d.id  = f.id
     ),

     (
      "Henry"
     ),
    );

想要使用从此子查询返回的所有结果填充新表。如何在不收到 ERROR 1242 (21000): Subquery return more than 1 row

的情况下执行此操作

【问题讨论】:

  • 您可以将它与使用循环的过程一起使用以插入所有项目。
  • 我是 MySQL 新手,如何迭代结果?
  • @Michas 不,那行不通。我确实希望将所有结果都插入到这个表中。不只是一个
  • @Gah_Jamn-it INSERT ... SELECT 语法也适用于多行。

标签: mysql select subquery insert-into


【解决方案1】:
INSERT INTO Results (People, names )
   SELECT d.id, 'Henry'
   FROM Names f
   JOIN People d ON d.id  = f.id

将静态字符串 Henry 与您的 SELECT 查询结合起来。

【讨论】:

  • 如果我有多个名字怎么办?不仅是Henry,我还需要对它们进行迭代
  • 为我工作!谢谢。
  • 感谢@Ryan 的明确回答。我还想提请任何可能出于与我相同的原因来到这里的人注意,不需要包含 SELECT 语句的 VALUES 子句。我一直在 MySQL 中遇到错误,因为我使用的是 INSERT INTO table(column) VALUES(SELECT col FROM table)。
【解决方案2】:

这是我发现效果很好的方法。它有点长,但很多时候需要随机播放额外的数据。

从 table2 将多行插入到 table1 中,并带有值。 示例:

INSERT INTO table1 (col1, col2, col3, col4, col5) 
SELECT col1,col2,col3,col4,col5 
FROM table2 t2 
WHERE t2.val2 IN (MULTIPLE VALUES) 
AND (Another Conditional);

您可以插入硬编码值以插入多行重复数据:

INSERT INTO table1 (col1, col2, col3, col4, col5) 
SELECT "Value", col2, col3, "1900-01-01","9999-12-31" 
FROM table2 t2 
WHERE t2.val2 IN (MULTIPLE VALUES) 
AND (Another Conditional);

请注意:"Value","1900-01-01","9999-12-31" 将在所有插入的行中重复。

【讨论】:

    【解决方案3】:
      INSERT INTO Results
        (
         People,
         names,
        )
        SELECT d.id, 'Henry'
        FROM Names f
        JOIN People d ON d.id  = f.id
    

    【讨论】:

    【解决方案4】:
    INSERT INTO Results
        (
         People,
         names,
        )
        VALUES
        (
         (
           SELECT d.id
           FROM Names f
           JOIN People d ON (d.id  = f.id) limit 1
         ),
    
         (
          "Henry"
         ),
        );
    

    【讨论】:

    • 欢迎来到 Stack Overflow!不要只发布一段代码,请解释为什么这段代码可以解决所提出的问题。没有解释,这不是答案。
    • 这并不能真正回答问题。它是“[...] 所有结果从此子查询返回填充新表”,这将子查询结果限制为一行。 (我知道这个答案已经超过 4 年了,但我想我还是会指出这一点。)
    【解决方案5】:

    这个错误(子查询返回多于1行)的原因是你使用了括号()。更仔细地寻找最佳答案。它不包含围绕子查询的括号

    【讨论】:

      【解决方案6】:

      在 MySql 中,可以像下面这样插入来自字符串的多个值,以避免重复。谢谢。

         insert into brand(name) select * from ( 
      select 'Fender' as name 
      union select 'a' 
      union ..... ) t 
      where not exists (select 1 from brand t2 where t2.name COLLATE latin1_general_ci = t.name COLLATE utf8mb4_unicode_ci )
      

      【讨论】:

        【解决方案7】:

        insert into ec_element(parentid,name) select elementid , 'STARTUP' from ec_element where name = 'BG';

        insert 语句从找到的满足条件的表中获取值 elementid 和标签字符串。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-19
          相关资源
          最近更新 更多