Объедините INSERT INTO и SELECT для нескольких значений - PullRequest
0 голосов
/ 04 марта 2020

Я знаю, что наиболее распространенный способ вставки нескольких новых строк в таблицу:

INSERT INTO fruits (fruit, colorId)
VALUES ('apple', 1),
       ('orange', 2),
       ('strawberry', 3);

Я также знаю, что могу вставлять результаты, полученные из SELECT, даже используя пользовательские значения:

INSERT INTO fruits (fruit, colorId)
SELECT 'pear', id
FROM colors
WHERE color = 'green';

Дело в том, что, используя любой из этих параметров (или, может быть, другой, который я не знаю), я хотел бы вставить несколько значений, используя результат, полученный в таком запросе. Например:

SELECT id
FROM colors
WHERE color = 'yellow';

вернет одно значение 4 (идентификатор для yellow), которое я хотел бы использовать повторно в запросе множественной вставки, например

INSERT INTO fruits (fruit, colorId)
VALUES ('banana', id),
       ('lemon', id);

(где id должно быть 4). Возможно ли это?


РЕДАКТИРОВАТЬ: Кстати, я также хотел бы избежать использования подзапросов, таких как

INSERT INTO fruits (fruit, colorId)
VALUES ('banana', (SELECT id FROM colors WHERE color = 'yellow')),
       ('lemon',  (SELECT id FROM colors WHERE color = 'yellow'));

Ответы [ 2 ]

2 голосов
/ 04 марта 2020

Примерно так:

INSERT INTO fruits(fruit, colorid)
SELECT names.name, colors.id
FROM colors
CROSS JOIN (
    SELECT 'banana' AS name UNION ALL
    SELECT 'lemon'
) AS names
WHERE colors.color = 'yellow'

В MySQL 8 вы можете использовать конструктор табличных значений :

INSERT INTO fruits(fruit, colorid)
SELECT names.column_0, colors.id
FROM colors
CROSS JOIN (VALUES
    ROW('banana'),
    ROW('lemon')
) AS names
WHERE colors.color = 'yellow'
1 голос
/ 04 марта 2020

Кстати, вы можете сделать это, как показано ниже:

DECLARE @Id INT
SET @Id = (SELECT id FROM colors WHERE color = 'yellow')
INSERT INTO fruits (fruit, colorId)
VALUES ('banana', @Id),
   ('lemon',  @Id);
...