Даже если в таблицах указано разное количество столбцов, они все равно могут быть объединены в UNION следующим образом:
SELECT a, b, c, NULL AS d, f, NULL AS g, h, NULL AS i, j, o, NULL AS p, q
FROM tbl1
UNION ALL
SELECT a, NULL AS b, c, d, f, g, h, i, j, NULL AS o, p, q
FROM tbl2;
К сожалению, в MySQL / MariaDB вы не можете сделать это без явного ввода всех имен столбцов и позиционирования их вручную.
SAS PRO C SQL поддерживает то, что вам нужно, с помощью оператора OUTER UNION CORR. Там решение будет примерно таким:
SELECT * FROM tbl1
OUTER UNION CORR
SELECT * FROM tbl2;
К сожалению, это (пока) недоступно в MySQL / MariaDB. В конечном итоге вы можете эмулировать что-то подобное, используя хитрое использование GROUP_CONCAT и CONCAT, IFNULL и других функций, играя с INFORMATION_SCHEMA.COLUMNS, чтобы сгенерировать запрос SELECT в виде подготовленного оператора ... но я лично не стал бы go в этом направлении *. 1009 *
В любом случае - как основная c начальная точка этой ПЛОХАЯ идея ... Следующий запрос перечислит все уникальные столбцы из обеих таблиц (если база данных 'test' и таблицы 'tbl1' и 'tbl2'):
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'tbl1'
UNION
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'tbl2'
ORDER BY COLUMN_NAME;
Теперь мы объединим их в одно поле, разделенное запятыми:
SELECT GROUP_CONCAT(CONCAT("NULL AS ", COLUMN_NAME)) AS columns
FROM ( SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'tbl1'
UNION
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'tbl2'
ORDER BY COLUMN_NAME
) AS grouped_columns;
, затем мы можем запустить эта «команда» через подготовленный оператор SELECT, который в этом примере напечатает начальную строку со значениями NULL:
SET @s:='';
SELECT @s:=CONCAT('SELECT ', columns) AS start_row
FROM
(
SELECT GROUP_CONCAT(CONCAT('NULL AS ',COLUMN_NAME)) AS columns
FROM ( SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'tbl1'
UNION
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'tbl2'
ORDER BY COLUMN_NAME
) AS grouped_columns
) AS grouped_columns;
PREPARE stmt FROM @s;
EXECUTE stmt;
Этот запрос «чудовище» создаст что-то вроде строки ловушки ...
+------+------+------+------+------+------+------+------+------+------+------+------+
| a | b | c | d | f | g | h | i | j | o | p | q |
+------+------+------+------+------+------+------+------+------+------+------+------+
| NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
+------+------+------+------+------+------+------+------+------+------+------+------+
под которым нужно как-то придумать, как добавить записи из tbl1 и tbl2 на соответствующие позиции. Удачи. Я не буду бороться за это :) Это уже очень неэффективно, и я даже не близок к решению. Это не- go направление делать то, что ты хочешь. Просто введите имена столбцов вручную.