![](/img/trans.png)
[英]Multiple select from one row from A table and insert result as multiple rows in B table and repeat in one query
[英]Multiple row INSERT from a single SELECT result
我正在使用子查询的结果在表中插入多行:
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),
子查询的结果对于我要插入的每一行都是相同的,因此实际上只需要运行一次。 这样写,子查询不会多次运行吗? 有没有一种方法可以只运行一次该子查询,并且仍然将其结果重用到多行中?
您可以使用一个变量:
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 = 1的条件下将其加入如果您不想维护单独的表,则在Subquery中填充不同的值,因此您将拥有单独的表,请说fileNames fileNames:file1 file2 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
))
您可以通过UNION ALL
ING FROM
-less SELECT
交叉连接子查询和另一个子查询来获取文件。
INSERT INTO `doc-file`
(docId,
fileId)
SELECT x.id,
y.file
FROM (SELECT id
FROM documents
WHERE slug = :slug
LIMIT 1) x
CROSS JOIN (SELECT :file1 file
UNION ALL
SELECT :file2 file
UNION ALL
SELECT :file3 file) y;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.