2009-11-24 19 views

Respuesta

2

Si T1 y T2 coinciden exactamente tiene dos opciones. Puede select todas las columnas de T2 para insert into T1, o puede proporcionar una lista de columnas para la declaración insert.

Aunque al hacer un select MSSQL proporciona encabezados de columna esa información no es utilizada por una declaración insert para hacer coincidir las columnas.

1

Por qué no simplemente

INSERT INTO t1 
SELECT * FROM T2 
+5

tengo que saltar una columna (la que es la identidad clave principal) –

12

Sí, se puede omitir los nombres de los campos de la tabla que se inserta a, y se puede usar select * para obtener todos los campos de la tabla, pero no me recomendar este enfoque

Si omite el nombre del campo, los campos se corresponden por posición, no por nombre. Si los campos no están en el mismo orden, se mezclarán. En general, debe evitar confiar en el diseño exacto de las tablas, para minimizar el riesgo de que los cambios en las tablas interrumpan las consultas.

+1

¿Hay alguna manera de insertar todas las columnas excepto la 'key' identidad sin especificar todos los nombres de las columnas?Las tablas con las que trabajo contienen docenas de columnas y listarlas cada vez es realmente aburrido. –

+0

Quizás podría crear una vista con todas las columnas que desee y seleccionar * desde ella. – cindi

+1

@ Konstantin: No, no hay una forma simple de especificar todos los campos excepto el campo de identidad. Es todo o nada. – Guffa

12

Utilice siempre columnas explícitas tanto en INSERT como en la proyección SELECT. Incluso si usted no quiere, usted debe:

INSERT INTO T1 (C1, c2) 
SELECT C1, C2 FROM T2 
+3

Es una duplicación de código que deseo eliminar en favor del enfoque basado en convenciones (las columnas con los mismos nombres deben correlacionarse entre sí) –

+2

La duplicación de código no debe ser una buena práctica. –

+2

SQL es generalmente un lenguaje detallado. Por ejemplo, la cláusula group by es redundante en agregaciones, INTO es redundante. Creo que solo debes aceptar eso. – cindi

0

Si usted está preocupado acerca de los nombres de columna siempre se puede alias de ellas:

INSERT INTO T1 (C1, c2) 
SELECT C1 AS C1_ALIAS, C2 AS C2_ALIAS FROM T2 

O, más sucintamente:

INSERT INTO T1 (C1, c2) 
SELECT C1 C1_ALIAS, C2 C2_ALIAS FROM T2 

Aunque realmente no puedo pensar por qué uno querría en un ejemplo tan simple

+0

¿Es posible tener un alias para varias columnas? Por ejemplo, 'inserte en T1 ALL_COLUMNS_ALIAS seleccione (C1, C2, C3) como ALL_COLUMNS_ALIAS desde T2'? –

-1

Se hace referencia de la siguiente manera:

INSERT INTO NEWTABLENAME COL1[,COL2,..COLN] 
SELECT COL1[,COL2,..COLN] FROM THE EXISTINGTABLENAME 
0

Primero seleccione este sql, elija la línea de la tabla del resultado de sql y cambie el nombre de tabla de origen o destino. Si las tablas tienen las mismas columnas (el mismo orden no es necesario) será un trabajo.

 
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 
Cuestiones relacionadas