Создание одной таблицы из трех разных таблиц

У меня есть три таблицы в SQL и мне нужно, чтобы они все были объединены в одну. Мне нужны все поля из всех таблиц в одной таблице. Все таблицы содержат одни и те же поля только за три разных года. Я написал код, который:

CREATE TABLE COL_TBL_TRAINING_ALL_YEARS AS(
SELECT 
COL_TBL_2010_TRN_RESULTS_new.*,
COL_TBL_TRN_RESULTS_GEMS_2011.*, 
COL_TBL_TRN_RESULTS_GEMS_2012.*
FROM COL_TBL_2010_TRN_RESULTS_new,
COL_TBL_TRN_RESULTS_GEMS_2011, 
COL_TBL_TRN_RESULTS_GEMS_2012
WHERE COL_TBL_2010_TRN_RESULTS_new.SYS_EMP_ID_NR = COL_TBL_TRN_RESULTS_GEMS_2011.SYS_EMP_ID_NR = COL_TBL_TRN_RESULTS_GEMS_2012.SYS_EMP_ID_NR)

И я получаю неправильный синтаксис рядом с ошибкой слова «AS» и неправильный синтаксис рядом с «=»

Я прочитал свои книги по SQL и не могу найти объяснение метода для этого, любая помощь будет принята с благодарностью.


person user2119980    schedule 04.03.2013    source источник
comment
Возможный дубликат Как создать таблицу, используя запрос выбора в SQL Сервер?   -  person Brian Tompsett - 汤莱恩    schedule 24.03.2018


Ответы (3)


Вам нужно два сделать два шага:

  1. Используйте UNION ALL, как было упомянуто. Но если столбец отсутствует, вы должны использовать NULL для этого столбца.

  2. Вы должны вставить результат в новую таблицу.

Итак, это должно выглядеть так:

SELECT * 
INTO   yournewtablename 
FROM   (SELECT col1, 
               col2, 
               col3 
        FROM   col_tbl_2010_trn_results_new 
        UNION ALL 
        SELECT col1, 
               col2, 
               col3 
        FROM   col_tbl_trn_results_gems_2011 
        UNION ALL 
        SELECT col1, 
               col2, 
               NULL AS Col3 
        FROM   col_tbl_trn_results_gems_2012) n 

Вот демонстрация: SQL FIDDLE

person András Ottó    schedule 04.03.2013
comment
Я добавил все столбцы и нулевые значения, которые мне были нужны, и я получаю синтаксическую ошибку рядом с ')'. Я также удалил n, потому что решил, что это опечатка. - person user2119980; 04.03.2013
comment
Там нужно N, это имя внутренней таблицы. Это причина вашей синтаксической ошибки. Попробуйте демонстрацию SQL FIDDLE, если вы удалите n, вы получите ту же ошибку. - person András Ottó; 04.03.2013
comment
Таблицы содержат более 20 000 000 строк вместе. Я удалил одну, объединил две другие, удалил одну из них, затем прочитал первую удаленную таблицу, и теперь я пытаюсь объединить данные из двух таблиц. Я не могу создать новую таблицу из-за того, что для размещения данных недостаточно места, поэтому мне нужно просто объединить 2 таблицы, чтобы сформировать 1 таблицу, чтобы в итоге она содержала данные из всех 3 таблиц. Любые идеи? - person user2119980; 05.03.2013
comment
Может быть, вы можете попробовать с VIEW, если у вас столько записей и нет дополнительного места. - person András Ottó; 05.03.2013
comment
Если мне нужен стол (скажем, школа) - это предлагает множество курсов. И эти курсы являются строками в таблице школьных курсов. Как моя школьная таблица может содержать список школьных курсов? - person Lealo; 16.08.2017
comment
Вы должны определить отношение между двумя таблицами: это отношение 1 к n или отношение m к n. Скажем, курс Basic SQL предназначен только для одной школы или несколько школ предлагают этот курс. В случае от 1 до n школьные курсы должны иметь идентификатор школы в качестве foreing_key, в случае от n до m вам нужна таблица, которая упорядочивает идентификатор курса в идентификаторе школы. Я думаю, вы должны задать это как отдельный вопрос, потому что это другая тема. - person András Ottó; 17.08.2017

Вам нужен СОЮЗ ВСЕХ:

SELECT * FROM COL_TBL_2010_TRN_RESULTS_new UNION ALL
SELECT * FROM COL_TBL_TRN_RESULTS_GEMS_2011 UNION ALL 
SELECT * FROM COL_TBL_TRN_RESULTS_GEMS_2012
person Community    schedule 04.03.2013
comment
Я почти уверен, что CREATE TABLE AS SELECT вообще не является допустимым синтаксисом SQL Server, если только они не изменили что-то в 2012 году, что я пропустил. - person LittleBobbyTables - Au Revoir; 04.03.2013
comment
Я получаю сообщение об ошибке Все запросы, объединенные с использованием оператора UNION, INTERSECT или EXCEPT, должны иметь одинаковое количество выражений в своих целевых списках. Я забыл упомянуть, что в одной из таблиц отсутствует один столбец, в двух других таблицах есть - person user2119980; 04.03.2013
comment
@LittleBobbyTables: мой запрос не включает CREATE TABLE AS SELECT. - person ; 04.03.2013
comment
@user2119980: На самом деле, в вашем вопросе прямо указано: Все таблицы содержат одни и те же поля только за три разных года. Добавьте структуру таблиц к вашему вопросу, и я соответствующим образом изменю запрос; в качестве альтернативы добавьте отсутствующее поле в соответствующую таблицу, и запрос должен работать как есть. - person ; 04.03.2013

Ваш синтаксис выглядит по существу правильным, если предположить, что ваш подзапрос возвращает результат. Две вещи, которые вы, возможно, захотите попробовать:

  1. Запустите оператор SELECT сам по себе, чтобы убедиться в его правильности.
  2. Поставьте пробел между AS и скобками.

Согласно этой странице скобки обязательны.

person Deep in the Code    schedule 04.03.2013