2016-02-11 3 views
2

Итак, у меня есть две таблицы с несколькими парами похожих столбцов, которые мне нужно объединить, чтобы дать им общую последовательность, но без объединения каких-либо данных.SQL: Объедините две таблицы без «Присоединиться»

Например:

Таблица Foo:

AccountID Date  FooType 
-------------------------------- 
1234  12/24/15 A 
1234  12/12/15 A 
5464  01/04/15 A 

Таблица Бар:

AccountID Date  BarAmount BarFlag 
-------------------------------------------- 
1234  05/03/15 12.56  1 
7657  02/14/15 5.11  0 
9879  01/04/15 8.00  1 

Цель состоит в том, чтобы получить выход быть:

AccountID Date  BarAmount BarFlag FooType 
------------------------------------------------------- 
1234  05/03/15 12.56  1   NULL 
1234  12/24/15 NULL  NULL  A 
1234  12/12/15 NULL  NULL  A 
7657  02/14/15 5.11  0   NULL 
9879  01/04/15 8.00  1   NULL 
5464  01/04/15 NULL  NULL  A 

Таким образом, в другими словами, я не хочу комбинировать ne, присоединившись к AccountID (это даст мне 4 или 5 строк в зависимости от того, как я его настроил), но я хочу, чтобы столбцы были заполнены, когда они называются одинаковыми. (существует некоторый кроссовер между таблицами)

UNION ALL дает мне ошибку, потому что таблицы, имеющие несколько столбцов, очень разные. Ошибка, которую он дает: «Все запросы, объединенные с использованием оператора UNION, INTERSECT или EXCEPT, должны иметь равное количество выражений в своих целевых списках». Некоторые статьи утверждают, что это можно обойти, указав имена столбцов. Я попробовал это (запрос ниже), и он все еще дал мне ошибку.

SELECT [AccountID],[Date],[BarAmount],[BarFlag] FROM Bar 
UNION ALL 
SELECT [AccountID],[Date],[FooType] FROM Foo 

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

SELECT * INTO NewTable FROM Bar 

Тогда я бы все записи из бара, и SQL услужливо создает столбцы для меня. Однако, когда я хочу получить записи из Foo, я не могу сделать еще один INSERT INTO, потому что таблица уже существует. Я могу сделать INSERT INTO, но как добавить дополнительные столбцы, которые не существуют в NewTable, без указания их имени и типа данных в инструкции ALTER TABLE? (Поскольку я не буду знать, каковы их имена и типы данных, которые могут оказаться трудными)

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

Edit:

Что же это спасибо! Иногда это самая маленькая вещь, которая имеет значение. Одно замечание для тех, кто может ссылаться на этот вопрос в будущем: порядок имеет значение! Я построил свой запрос на основе этого ответа и начал получать сообщение об ошибке. Ошибка: «Ошибка конверсии при преобразовании даты и/или времени из символьной строки». потому, что вместо вышеуказанного запроса, я сделал что-то похожее на это:

SELECT **[Date]**,[AccountID],[BarAmount],[BarFlag],NULL as FooType FROM Bar 
UNION ALL 
SELECT [AccountID],**[Date]**,NULL,NULL,[FooType] FROM Foo 

Он пытается поместить текст в колонку даты и не смогли согласовать его, так что он не будет работать. Когда столбцы являются общими, порядок имеет значение (и это логично). Еще раз спасибо!

ответ

5

Вы были близки - у union all должно быть одинаковое количество столбцов.Попробуйте следующее:

SELECT [AccountID],[Date],[BarAmount],[BarFlag],NULL as FooType FROM Bar 
UNION ALL 
SELECT [AccountID],[Date],NULL,NULL,[FooType] FROM Foo 
+0

Этому спасибо! Комментарии, дающие мне подходит: см. Отредактированный пост – mfleming14

Смежные вопросы