Используемые операторы SELECT имеют разное количество столбцов

для примеров я не знаю, сколько строк в каждой таблице, и я пытаюсь сделать вот так:

SELECT * FROM members 
UNION 
SELECT * FROM inventory

что я могу поставить на второй SELECT вместо *, чтобы удалить эту ошибку без добавления NULL'ы?

5 ответов


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

обновление:

Я действительно не думаю, что вы хотите объединять эти таблицы, основываясь на именах таблиц. Похоже, они не содержат связанных данных. Если вы опубликуете свою схему и опишете, чего вы пытаетесь достичь, вероятно, мы сможем предоставить лучшую помощь.


вы могли бы сделать

SELECT *
from members
UNION
SELECT inventory.*, 'dummy1' AS membersCol1, 'dummy2' AS membersCol2
from inventory;

здесь membersCol1, membersCol12, etc... имена столбцов из members, не inventory. Таким образом, оба запроса в объединении будут иметь одинаковые столбцы (при условии, что все столбцы в inventory такие же как и в members что мне кажется очень странным... но эй, это твоя схема).

обновление:

как отметил HLGEM, это будет только работать, если inventory есть столбцы с те же имена, что и members и в том же порядке. Называть все столбцы явно-лучшая идея,но поскольку я не знаю имен, я не могу этого сделать. Если бы я это сделал, это могло бы выглядеть примерно так:

SELECT id, name, member_role, member_type
from members
UNION
SELECT id, name, '(dummy for union)' AS member_role, '(dummy for union)' AS member_type
from inventory;

мне не нравится использовать NULL для фиктивных значений, потому что тогда не всегда ясно, из какой части Союза пришла запись - использование "фиктивного" дает понять, что запись из той части Союза, у которой не было этой записи (хотя иногда это может быть не так вопрос.) Сама идея объединения этих двух таблиц кажется мне очень странной, потому что я очень сомневаюсь, что у них будет более 1 или 2 столбцов с тем же именем, но вы задали вопрос таким образом, что я думаю, что в вашем сценарии это каким-то образом имеет смысл.


вы уверены, что не хотите присоединиться вместо этого? Маловероятно, что UNOIN даст вам то, что вы хотите, учитывая имена таблиц.


Я не знаю, сколько строк в каждой таблице

вы уверены, что это не то, что вы хотите?

SELECT 'members' AS TableName, Count(*) AS Cnt FROM members 
UNION ALL
SELECT 'inventory', Count(*) FROM inventory

каждый оператор SELECT в MySQL UNION ALL operator должен иметь одинаковое количество полей в результирующих наборах с аналогичными типами данных Посещение https://www.techonthenet.com/mysql/union_all.php