Автоматически сопоставлять столбцы в INSERT INTO... SELECT... FROM
Вопрос SQL Server.
При выполнении
INSERT INTO T1 SELECT (C1, C2) FROM T2
Я не хочу указывать имена столбцов T1
, потому что они такие же, как в T2
Можно ли это сделать?
В настоящее время я получаю сообщение об ошибке
Msg 213, уровень 16, состояние 1, строка 1
Имя столбца или количество заданных значений не соответствует определению таблицы.
Ответы
Ответ 1
Если T1
и T2
совпадают, у вас есть два варианта. Вы можете использовать select
все столбцы из T2
для insert into T1
, или вы можете предоставить список столбцов в инструкции insert
.
Несмотря на то, что при выполнении select
MSSQL предоставляет заголовки столбцов, эта информация не используется оператором insert
для соответствия столбцам вверх.
Ответ 2
Да, вы можете опустить имена полей для таблицы, в которую вы вставляете, и вы можете использовать select * для получения всех полей из таблицы, но я бы не рекомендовал этот подход.
Если вы опускаете имя поля, поля сопоставляются положением, а не по имени. Если поля не находятся в одном и том же порядке, они будут замешаны. Как правило, вам не следует полагаться на точное расположение таблиц, чтобы свести к минимуму риск того, что изменения в таблицах нарушают запросы.
Ответ 3
Всегда используйте явные столбцы как в INSERT, так и в проекции SELECT. Даже если вы этого не хотите, вы должны:
INSERT INTO T1 (C1, c2)
SELECT C1, C2 FROM T2
Ответ 4
Почему бы просто не
INSERT INTO t1
SELECT * FROM T2
Ответ 5
Если вас беспокоят имена столбцов, вы всегда можете их использовать:
INSERT INTO T1 (C1, c2)
SELECT C1 AS C1_ALIAS, C2 AS C2_ALIAS FROM T2
Или, более лаконично:
INSERT INTO T1 (C1, c2)
SELECT C1 C1_ALIAS, C2 C2_ALIAS FROM T2
Хотя я не могу по-настоящему думать, почему нужно было бы на таком простом примере
Ответ 6
Сначала выберите этот sql, выберите строку таблицы из результата sql и измените целевое или исходное имя табуляции. Если таблицы имеют одинаковые столбцы (такой же порядок не требуется), это будет работа.
with xparams as ( select (select user from dual) "OWNER", '' "ADDSTRTOFROMTABLENAME" from dual )
,t1 as ( SELECT dbat.table_name from dba_tables dbat, xparams where dbat.owner = xparams.OWNER )
,t1c1 as ( SELECT utcs.table_name , LISTAGG(utcs.column_name,',') within group (order by utcs.column_name) "COLS" from USER_TAB_COLUMNS utcs, t1 where utcs.table_name = t1.table_name group by utcs.table_name )
,res1 as ( SELECT 'insert into '|| t1c1.table_name || ' ( '|| t1c1.COLS ||') select '|| t1c1.COLS || ' from ' || t1c1.table_name||xparams.ADDSTRTOFROMTABLENAME ||';' "RES" from t1c1, xparams order by t1c1.table_name )
select * from res1
Ответ 7
Он ссылается следующим образом:
INSERT INTO NEWTABLENAME COL1[,COL2,..COLN]
SELECT COL1[,COL2,..COLN] FROM THE EXISTINGTABLENAME