2010-09-01 3 views
10

Для примеров я не знаю, сколько строк в каждой таблице, и я пытаюсь сделать так:Используемые ЗЕЬЕСТ имеют разное количество столбцов

SELECT * FROM members 
UNION 
SELECT * FROM inventory 

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

+6

Почему вы хотите объединить две таблицы совершенно разных контекстов? – Joe

+2

Вы никогда не будете использовать select * в любом запросе, который будет запущен при производстве. Вы всегда должны указывать только те столбцы, которые вам нужны как для удобства, так и для производительности. – HLGEM

ответ

9

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

Update:

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

+0

Я ничего не знаю о каких-либо именах, ничего. Возможно ли это? –

+0

Почему это было приостановлено? –

+1

@hey: используйте DESC your_table_name', чтобы узнать столбцы и их типы данных перед написанием запроса UNION. –

6

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

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

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

UPDATE:

Как 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 столбца с одинаковым именем, но вы задали вопрос таким образом, чтобы я представлял в своем сценарии это как-то имеет смысл.

+1

Почему бы не использовать 'NULL' вместо 'dummy1' и 'dummy2'? – dan04

+0

Даже если это сработает, вам все равно нужно указать имена столбцов, так как столбцы могут или не могут находиться в одном порядке в обеих таблицах (или оставаться в том же порядке навсегда). Плюс, если в инвентаре добавлен дополнительный столбец, объединение сломается. Никогда не делайте UNOIN без указания столбцов. Также все профсоюзы должны рассматриваться как кандидаты от UNION ALL, который намного более эффективен, если нет возможности обмана, который необходимо отфильтровать. – HLGEM

+0

Говорить, как делать что-то, что явно неверно, вредит бедному человеку, задающему вопрос, а не помогая ему. – ErikE

2

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

0

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

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

SELECT 'members' AS TableName, Count(*) AS Cnt FROM members 
UNION ALL 
SELECT 'inventory', Count(*) FROM inventory 
Смежные вопросы