Как сгенерировать подготовленный запрос MySQL из массива переменных? - PullRequest
0 голосов
/ 22 марта 2019

Моя цель - объединить таблицы из разных схем в одну схему, поэтому я хотел бы выполнить этот запрос:

INSERT INTO inventory.maintenance
SELECT *
FROM (
    SELECT NULL, 'A' as department_id, maintenance.* FROM a_inventory.maintenance
    UNION
    SELECT NULL, 'B' as department_id, maintenance.* FROM b_inventory.maintenance
    UNION
    SELECT NULL, 'E' as department_id, maintenance.* FROM e_inventory.maintenance
    UNION
    SELECT NULL, 'L' as department_id, maintenance.* FROM l_inventory.maintenance
    UNION
    SELECT NULL, 'M' as department_id, maintenance.* FROM m_inventory.maintenance
) AS tmp_maintenance

Мне нужно выполнить этот запрос для многих различных таблиц, и все таблицы не находятся ввсе отделы.Вместо того, чтобы писать каждый запрос вручную, я хотел бы добавить немного автоматизации ...

SET @department = ('A', 'B', 'E', 'L', 'M');
SET @connection = 'inventory';
SET @table = 'maintenance';

/* MAGIC HERE to create @union */

SET @s = CONCAT(
    'INSERT INTO ', @connection, '.', @table,
    'SELECT * FROM (', @union, ') AS tmp');

PREPARE stm1 FROM @s; EXECUTE stm1; DEALLOCATE PREPARE stm1;    

Я хотел бы создать @union из @department.Я пытался использовать REPEAT, но на самом деле это не работает.

1 Ответ

0 голосов
/ 22 марта 2019

Один из возможных способов решения этой проблемы.Но вам нужно иметь таблицу departments, из которой можно извлечь id, предполагая, что id является char:

SET @department = 'A,B,E,L,M' COLLATE utf8mb4_unicode_ci;
SET @connection = 'inventory';
SET @table = 'maintenance';

SET @union = '';
SELECT @union := CONCAT(
    @union, 
    ' SELECT NULL, "', id , '", ', 
    @table,'.* FROM ', id, '_', 
    @connection, '.', @table, 
    ' UNION '
)
FROM departments WHERE FIND_IN_SET(id, @department);

SELECT @union := SUBSTRING(@union, 1, LENGTH(@union) - LENGTH('UNION '));

SET @s = CONCAT(
    'INSERT INTO ', @connection, '.', @table, ' '
    '( SELECT * FROM (', @union, ') AS tmp)');

SELECT @s;

PREPARE stm1 FROM @s; EXECUTE stm1; DEALLOCATE PREPARE stm1;    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...