来自单个SELECT结果的多行INSERT

时间:2019-04-14 21:10:35

标签: mysql sql subquery

我正在使用子查询的结果在表中插入多行:

INSERT INTO `doc-file` (docId, fileId) VALUES
    ((SELECT id FROM documents WHERE slug = :slug LIMIT 1), :file1),
    ((SELECT id FROM documents WHERE slug = :slug LIMIT 1), :file2),
    ((SELECT id FROM documents WHERE slug = :slug LIMIT 1), :file3),

子查询的结果对于我要插入的每一行都是相同的,因此实际上只需要运行一次。这样写,子查询不会多次运行吗?有没有一种方法可以只运行一次该子查询,并且仍然将其结果重复使用到多行中?

3 个答案:

答案 0 :(得分:1)

您可以使用变量:

set @value = (SELECT id FROM documents WHERE slug = :slug LIMIT 1);
INSERT INTO `doc-file` (docId, fileId) VALUES
    (@value, :file1),
    (@value, :file2),
    (@value, :file3),

答案 1 :(得分:0)

您可以在单独的临时表中唯一文件,并按1 = 1的条件将其加入 如果您不想维护单独的表,则在子查询中填充不同的值 所以您将有单独的表,让说fileNames 文件名: 文件1 文件2 file3

  INSERT INTO `doc-file` (docId, fileId) VALUES
        ( select a.id,f.fileID 
        (SELECT id FROM documents WHERE slug = :slug LIMIT 1) a 
        inner join filenames f on 1=1 
    ))

答案 2 :(得分:0)

您可以通过UNION ALLFROM的{​​{1}}交叉连接子查询和另一个子查询来获取文件。

SELECT