759 votos

SQL Insert into ... values ( SELECT ... FROM ... )

Estoy tratando de insertar en una tabla mediante la entrada de otra tabla. Aunque esto es totalmente factible para muchos motores de base de datos, siempre me cuesta recordar la sintaxis correcta para el motor de SQL que toque (MySQL, Oracle, SQL Server, Informixy DB2).

Hay alguna bala de plata de sintaxis que venga de un estándar SQL (por ejemplo, SQL-92) que me permita insertar los valores sin tener que preocuparme acerca de la base de datos subyacente?

893voto

Shadow_x99 Puntos 10421

Prueba:

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2

Esto funciona para:

Oracle  
MS SQL Server  
MySQL  
Postgres  
SQLite v3  
TeraData  
DB2  
SyBase

583voto

travis Puntos 14676

@Shadow_x99: Eso debería funcionar bien, y usted también puede tener varias columnas y otros datos, así:

INSERT INTO table1 ( column1, column2, someInt, someVarChar )
SELECT  table2.column1, table2.column2, 8, 'some string etc.'
FROM    table2
WHERE   table2.ID = 7;

Edit: debo mencionar que solo he usado esta sintaxis con Access, SQL 2000/2005/Express, MySql y PostGres, por lo que los que deben estar cubiertos. Un comentario dice que también funciona en SqlLite3

36voto

IanAuld Puntos 1894

Para obtener un único valor en un multi valor INSERT de otra tabla hice lo siguiente en SQLite3:

INSERT INTO column_1 ( val_1, val_from_other_table ) 
VALUES('val_1', (SELECT  val_2 FROM table_2 WHERE val_2 = something))

33voto

Jonathan Leffler Puntos 299946

Tanto las respuestas que me vea bien en Informix en concreto, y son, básicamente, el estándar SQL. Es decir, la notación:

INSERT INTO target_table[(<column-list>)] SELECT ... FROM ...;

funciona bien con Informix y, espero, todos los DBMS. (Una vez después de 5 años o más, este es el tipo de cosa que MySQL no siempre de apoyo; ahora tiene un soporte decente para este tipo de sintaxis SQL estándar y, AFAIK, que funcionaría bien en este tipo de notación.) La lista de columnas es opcional, sino que indica las columnas de destino en secuencia, de manera que la primera columna del resultado de la selección va a ir en el primero que aparece la columna, etc. En ausencia de la lista de columnas, la primera columna del resultado de la selección se va en la primera columna de la tabla de destino.

¿Qué puede ser diferente entre los sistemas es la notación utilizada para identificar las tablas en bases de datos diferentes - la norma no tiene nada que decir acerca de inter-base de datos (digamos entre DBMS) para las operaciones. Con Informix, puede utilizar la siguiente notación para identificar a una tabla:

[dbase[@server]:][owner.]table

Es decir, usted puede especificar una base de datos, opcionalmente se puede identificar el servidor que aloja la base de datos si no está en el servidor actual, seguido por un facultativo propietario, punto, y por último el nombre de la tabla real. El estándar SQL se utiliza el término de esquema para lo Informix llamadas de el propietario. Por lo tanto, en Informix, cualquiera de las siguientes notaciones podría identificar una tabla:

table
"owner".table
dbase:table
dbase:owner.table
dbase@server:table
dbase@server:owner.table

El propietario, en general, no necesitan ser citado; sin embargo, si usted hace uso de citas, usted necesita para obtener el nombre del propietario escrito correctamente, se vuelve sensible a mayúsculas. Que es:

someone.table
"someone".table
SOMEONE.table

todas identificar a la misma mesa. Con Informix, hay una leve complicación con el MODO ANSI bases de datos, donde los nombres de propietario generalmente son convertidos a mayúsculas (informix es la excepción). Es decir, en un MODO ANSI base de datos (no utilizadas), usted podría escribir:

CREATE TABLE someone.table ( ... )

y el nombre del propietario en el catálogo del sistema podría ser "ALGUIEN"en lugar de " alguien". Si usted encerrar el nombre del propietario en comillas dobles, actúa como un identificador delimitado. Con SQL estándar, los identificadores delimitados pueden ser utilizados muchos lugares. Con Informix, usted puede hacer uso de ellos sólo en torno a los nombres de propietario -- en otros contextos, Informix trata tanto de comillas simples y dobles comillas las cadenas como cadenas de caracteres, en lugar de separar comillas simples cadenas de caracteres las cadenas y cadenas de comillas dobles como identificadores delimitados. (Por supuesto, sólo para su integridad, no es una variable de entorno, DELIMIDENT, que puede ser ajustado a cualquier valor, pero Y es más seguro - para indicar que las comillas dobles siempre rodean a los identificadores delimitados y comillas simples siempre rodean a las cadenas.)

Tenga en cuenta que MS SQL Server administra el uso de [identificadores delimitados] entre corchetes. Parece extraño para mí, y ciertamente no es parte del estándar SQL.

15voto

Santhosh Puntos 984

La mayoría de las bases de datos siguen la sintaxis básica,

INSERT INTO TABLE_NAME
SELECT COL1, COL2 ...
FROM TABLE_YOU_NEED_TO_TAKE_FROM
;

Cada base de datos que he utilizado seguir esta sintaxis es decir, DB2, SQL Server, MY SQL, PostgresQL

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X