Многострочная вставка из одного результата SELECT - PullRequest
0 голосов
/ 15 апреля 2019

Я вставляю несколько строк в таблицу, используя результат из подзапроса:

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 ]

1 голос
/ 15 апреля 2019

Вы можете использовать переменную:

set @value = (SELECT id FROM documents WHERE slug = :slug LIMIT 1);
INSERT INTO `doc-file` (docId, fileId) VALUES
    (@value, :file1),
    (@value, :file2),
    (@value, :file3),
0 голосов
/ 15 апреля 2019

Вы можете перекрестно соединить подзапрос и другой подзапрос, получив файлы, UNION ALL ing FROM -less SELECT s.

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;
0 голосов
/ 15 апреля 2019

вы можете создавать уникальные файлы в отдельной временной таблице и объединять их при условии, что 1 = 1 Если вы не хотите поддерживать отдельную таблицу, заполните отдельные значения в подзапросе так что у вас будут отдельные таблицы, пусть говорит 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 
    ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...