簡體   English   中英

來自單個SELECT結果的多行INSERT

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM