SQL: внешнее соединение двух таблиц в строке и вставка аналогичного в другую

У меня есть две таблицы A и B с 30 столбцами (одинаковые имена переменных, данные за разные годы), без первичного ключа, почти миллион записей в каждой.

Я хочу сравнить A.X1 с B.X1 (nvarchar8, содержит пробелы, -, буквы и цифры) и вставить результаты внешнего соединения в другую таблицу C (с теми же 30 столбцами), чтобы у меня были все строки A и где B!=A на B .Х1).

Пример:

Таблица А

X1   X2   X3 ..... X30
11   E     R .....  G
12   R     4        L
13  S      5        NULL   
14  D      T        NULL

Таблица Б

X1   X2   X3 ..... X30
11   E     R .....  G
12   R     4        L
15  R2     56        NULL   
16  R1      T1        NULL

Результирующая таблица C

X1   X2   X3 ..... X30
11   E     R .....  G
12   R     4        L
13  S      5        NULL   
14  D      T        NULL
15  R2     56        NULL   
16  R1      T1        NULL

Как я это сделал.

Я старался

INSERT INTO C
SELECT *
from A
full outer join B
on A.X1 = B.X1

Ошибка, которую я получаю

Сообщение 213, уровень 16, состояние 1, строка 1
Ошибка вставки: имя столбца или количество предоставленных значений не соответствует определению таблицы.

Я создал C, который в настоящее время пуст.


person Siftekhar    schedule 01.08.2013    source источник
comment
Кажется, все, что вам нужно, это СОЮЗ А и Б.   -  person Noel    schedule 01.08.2013
comment
Вместо SELECT * вы должны указать имена столбцов.   -  person John Sheridan    schedule 01.08.2013
comment
И вы также всегда должны указывать столбец в предложении INSERT, чтобы избежать каких-либо неожиданностей и проблем!   -  person marc_s    schedule 01.08.2013


Ответы (2)


Ваш запрос не будет работать, потому что вы присоединяетесь к таблицам и перенастраиваете *, что приводит к удвоению количества столбцов, которое вам нужно. Что вы действительно хотите сделать, так это выбрать все из таблицы A, а затем добавить (вместо объединения) все записи из таблицы B. Добавление достигается с помощью UNION. Вот пример кода. Примечание: никогда не используйте SELECT *. Добавьте следующее, чтобы включить специально названные поля в правильном порядке.

Кроме того, я использую UNION, а не UNION ALL, чтобы запрос автоматически исключал записи в B, которые являются дубликатами записей в A.

SELECT FIELDS...
FROM TABLEA
UNION
SELECT SAME_FIELDS...
FROM TABLEB
person Declan_K    schedule 01.08.2013

person    schedule
comment
Внешнее соединение между A и B приведет к таблице шириной 60 столбцов. C имеет всего 30 столбцов. - person Andomar; 01.08.2013
comment
Вот почему я сказал явно перечислить все tableA.Fields. Спасибо за минус. - person ganders; 01.08.2013
comment
Этот вид операции требует объединения, а не объединения. Вы упускаете суть. И это не мой минус. - person Andomar; 01.08.2013