Pregunta

estoy tratando de INSERT INTO una tabla usando la entrada de otra tabla.Aunque esto es completamente factible para muchos motores de bases de datos, siempre parece que me cuesta recordar la sintaxis correcta para el SQL motor del día (mysql, Oráculo, servidor SQL, informax, y DB2).

¿Existe una sintaxis milagrosa proveniente de un estándar SQL (por ejemplo, SQL-92) que me permitiría insertar los valores sin preocuparme por la base de datos subyacente?

¿Fue útil?

Solución

Intentar:

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2  

Este es ANSI SQL estándar y debería funcionar en cualquier DBMS.

Definitivamente funciona para:

  • Oráculo
  • Servidor MS SQL
  • mysql
  • Postgres
  • SQLite v3
  • teradata
  • DB2
  • Sybase
  • vertical
  • HSQLDB
  • H2
  • AWS RedShift
  • SAP HANA

Otros consejos

@sombra_x99:Eso debería funcionar bien y también puedes tener varias columnas y otros datos:

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

Editar:Debo mencionar que sólo he usado esta sintaxis con Access, SQL 2000/2005/Express, MySQL y PostgreSQL, por lo que deberían estar cubiertas.Un comentarista ha señalado que funcionará con SQLite3.

Para obtener solo un valor en un valor múltiple INSERT desde 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))

Ambas respuestas que veo funcionan bien específicamente en Informix y son básicamente SQL estándar.Es decir, la notación:

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

Funciona bien con Informix y, supongo, con todos los DBMS.(Érase una vez hace 5 años o más, este es el tipo de cosas que MySQL no siempre admitía;ahora tiene un soporte decente para este tipo de sintaxis SQL estándar y, AFAIK, funcionaría bien en esta notación). La lista de columnas es opcional pero indica las columnas de destino en secuencia, por lo que la primera columna del resultado de SELECT irá en la primera columna de la lista, etc.En ausencia de la lista de columnas, la primera columna del resultado de SELECT va a la primera columna de la tabla de destino.

Lo que puede ser diferente entre sistemas es la notación utilizada para identificar tablas en diferentes bases de datos: el estándar no tiene nada que decir sobre las operaciones entre bases de datos (y mucho menos entre DBMS).Con Informix, puede utilizar la siguiente notación para identificar una tabla:

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

Es decir, puede especificar una base de datos, identificando opcionalmente el servidor que aloja esa base de datos si no está en el servidor actual, seguido de un propietario opcional, un punto y, finalmente, el nombre real de la tabla.El estándar SQL utiliza el término esquema para lo que Informix llama propietario.Así, 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

En general, no es necesario citar al propietario;sin embargo, si utiliza comillas, debe escribir correctamente el nombre del propietario; distingue entre mayúsculas y minúsculas.Eso es:

someone.table
"someone".table
SOMEONE.table

todos identifican la misma tabla.Con Informix, existe una leve complicación con las bases de datos MODE ANSI, donde los nombres de los propietarios generalmente se convierten a mayúsculas (informix es la excepción).Es decir, en una base de datos MODE ANSI (no utilizada comúnmente), podría escribir:

CREATE TABLE someone.table ( ... )

y el nombre del propietario en el catálogo del sistema sería "ALGUIEN", en lugar de "alguien".Si incluye el nombre del propietario entre comillas dobles, actúa como un identificador delimitado.Con SQL estándar, los identificadores delimitados se pueden utilizar en muchos lugares.Con Informix, puede utilizarlos sólo alrededor de los nombres de propietarios; en otros contextos, Informix trata las cadenas entre comillas simples y dobles como cadenas, en lugar de separar las cadenas entre comillas simples como cadenas y las cadenas entre comillas dobles como identificadores delimitados.(Por supuesto, solo para completar, hay una variable de entorno, DELIMIDENT, que se puede establecer (en cualquier valor, pero Y es más seguro) para indicar que las comillas dobles siempre rodean los identificadores delimitados y las comillas simples siempre rodean las cadenas).

Tenga en cuenta que MS SQL Server logra utilizar [identificadores delimitados] entre corchetes.Me parece extraño y ciertamente no forma parte del estándar SQL.

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
;

Todas las bases de datos que he utilizado siguen esta sintaxis, es decir, DB2, SQL Server, MY SQL, PostgresQL

Para agregar algo en la primera respuesta, cuando queremos solo unos pocos registros de otra tabla (en este ejemplo solo uno):

INSERT INTO TABLE1
(COLUMN1, COLUMN2, COLUMN3, COLUMN4) 
VALUES (value1, value2, 
(SELECT COLUMN_TABLE2 
FROM TABLE2
WHERE COLUMN_TABLE2 like "blabla"),
value4);

Esto se puede hacer sin especificar las columnas en el INSERT INTO parte si está proporcionando valores para todas las columnas en el SELECT parte.

Digamos que la tabla1 tiene dos columnas.Esta consulta debería funcionar:

INSERT INTO table1
SELECT  col1, col2
FROM    table2

Esto NO funcionaría (valor para col2 no se especifica):

INSERT INTO table1
SELECT  col1
FROM    table2

Estoy usando MS SQL Server.No sé cómo funcionan otros RDMS.

En lugar de VALUES parte de INSERT consulta, solo usa SELECT consulta como se muestra a continuación.

INSERT INTO table1 ( column1 , 2, 3... )
SELECT col1, 2, 3... FROM table2

Este es otro ejemplo que utiliza valores con select:

INSERT INTO table1(desc, id, email) 
SELECT "Hello World", 3, email FROM table2 WHERE ...

Inserción simple cuando se conoce la secuencia de columnas de la tabla:

    Insert into Table1
    values(1,2,...)

Inserción simple que menciona la columna:

    Insert into Table1(col2,col4)
    values(1,2)

Inserción masiva cuando el número de columnas seleccionadas de una tabla (#table2) es igual a la tabla de inserción (Tabla1)

    Insert into Table1 {Column sequence}
    Select * -- column sequence should be same.
       from #table2

Inserción masiva cuando desea insertar solo en la columna deseada de una tabla (tabla1):

    Insert into Table1 (Column1,Column2 ....Desired Column from Table1)  
    Select Column1,Column2..desired column from #table2
       from #table2

A continuación se muestra otro ejemplo en el que se toma la fuente utilizando más de una tabla:

INSERT INTO cesc_pf_stmt_ext_wrk( 
  PF_EMP_CODE    ,
  PF_DEPT_CODE   ,
  PF_SEC_CODE    ,
  PF_PROL_NO     ,
  PF_FM_SEQ      ,
  PF_SEQ_NO      ,
  PF_SEP_TAG     ,
  PF_SOURCE) 
SELECT
  PFl_EMP_CODE    ,
  PFl_DEPT_CODE   ,
  PFl_SEC         ,
  PFl_PROL_NO     ,
  PF_FM_SEQ       ,
  PF_SEQ_NO       ,
  PFl_SEP_TAG     ,
  PF_SOURCE
 FROM cesc_pf_stmt_ext,
      cesc_pfl_emp_master
 WHERE pfl_sep_tag LIKE '0'
   AND pfl_emp_code=pf_emp_code(+);

COMMIT;

Aquí se explica cómo insertar desde varias tablas.Este ejemplo particular es donde tienes una tabla de mapeo en un escenario de muchos a muchos:

insert into StudentCourseMap (StudentId, CourseId) 
SELECT  Student.Id, Course.Id FROM Student, Course 
WHERE Student.Name = 'Paddy Murphy' AND Course.Name = 'Basket weaving for beginners'

(Me doy cuenta de que hacer coincidir el nombre del estudiante puede devolver más de un valor, pero ya entiendes la idea.Es necesario hacer coincidir algo que no sea un Id. cuando el Id. es una columna de Identidad y se desconoce).

INSERT INTO yourtable
SELECT fielda, fieldb, fieldc
FROM donortable;

Esto funciona en todos los DBMS

Puedes probar esto si quieres insertar todas las columnas usando SELECT * INTO mesa.

SELECT  *
INTO    Table2
FROM    Table1;

Esto funcionó para mí:

insert into table1 select * from table2

La frase es un poco diferente a la de Oracle.

Para Microsoft SQL Server, recomendaré aprender a interpretar la SINTAXIS proporcionada en MSDN.Con Google es más fácil que nunca buscar sintaxis.

Para este caso particular, intente

Google:insertar sitio:microsoft.com

El primer resultado será http://msdn.microsoft.com/en-us/library/ms174335.aspx

Desplácese hacia abajo hasta el ejemplo ("Uso de las opciones SELECCIONAR y EJECUTAR para insertar datos de otras tablas") si le resulta difícil interpretar la sintaxis que se proporciona en la parte superior de la página.

[ WITH <common_table_expression> [ ,...n ] ]
INSERT 
{
        [ TOP ( expression ) [ PERCENT ] ] 
        [ INTO ] 
        { <object> | rowset_function_limited 
          [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
        }
    {
        [ ( column_list ) ] 
        [ <OUTPUT Clause> ]
        { VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n     ] 
        | derived_table       <<<<------- Look here ------------------------
        | execute_statement   <<<<------- Look here ------------------------
        | <dml_table_source>  <<<<------- Look here ------------------------
        | DEFAULT VALUES 
        }
    }
}
[;]

Esto debería ser aplicable a cualquier otro RDBMS disponible allí.En mi opinión, no tiene sentido recordar toda la sintaxis de todos los productos.

De hecho, prefiero lo siguiente en SQL Server 2008:

SELECT Table1.Column1, Table1.Column2, Table2.Column1, Table2.Column2, 'Some String' AS SomeString, 8 AS SomeInt
INTO Table3
FROM Table1 INNER JOIN Table2 ON Table1.Column1 = Table2.Column3

Elimina el paso de agregar el conjunto Insertar () y usted simplemente selecciona qué valores van en la tabla.

Sólo use paréntesis para SELECCIONAR cláusula en INSERT.Por ejemplo así:

INSERT INTO Table1 (col1, col2, your_desired_value_from_select_clause, col3)
VALUES (
   'col1_value', 
   'col2_value',
   (SELECT col_Table2 FROM Table2 WHERE IdTable2 = 'your_satisfied_value_for_col_Table2_selected'),
   'col3_value'
);
select *
into tmp
from orders

Se ve bien, pero funciona solo si tmp no existe (lo crea y lo completa).(servidor SQL)

Para insertar en una tabla tmp existente:

set identity_insert tmp on

insert tmp 
([OrderID]
      ,[CustomerID]
      ,[EmployeeID]
      ,[OrderDate]
      ,[RequiredDate]
      ,[ShippedDate]
      ,[ShipVia]
      ,[Freight]
      ,[ShipName]
      ,[ShipAddress]
      ,[ShipCity]
      ,[ShipRegion]
      ,[ShipPostalCode]
      ,[ShipCountry] )
      select * from orders

set identity_insert tmp off

La mejor manera de insertar varios registros de cualquier otra tabla.

INSERT  INTO dbo.Users
            ( UserID ,
              Full_Name ,
              Login_Name ,
              Password
            )
            SELECT  UserID ,
                    Full_Name ,
                    Login_Name ,
                    Password
            FROM    Users_Table
            (INNER JOIN / LEFT JOIN ...)
            (WHERE CONDITION...)
            (OTHER CLAUSE)
INSERT INTO FIRST_TABLE_NAME (COLUMN_NAME)
SELECT  COLUMN_NAME
FROM    ANOTHER_TABLE_NAME 
WHERE CONDITION;

Dos enfoques para insertar con subconsulta seleccionada.

  1. Con la subconsulta SELECT que devuelve resultados con Una fila.
  2. Con la subconsulta SELECT que devuelve resultados con Varias filas.

1.Enfoque para la subconsulta With SELECT que devuelve resultados con una fila.

INSERT INTO <table_name> (<field1>, <field2>, <field3>) 
VALUES ('DUMMY1', (SELECT <field> FROM <table_name> ),'DUMMY2');

En este caso, se supone que la subconsulta SELECT devuelve solo una fila de resultados según la condición WHERE o funciones agregadas de SQL como SUM, MAX, AVG, etc.De lo contrario arrojará un error.

2.Enfoque para la subconsulta With SELECT que devuelve resultados con varias filas.

INSERT INTO <table_name> (<field1>, <field2>, <field3>) 
SELECT 'DUMMY1', <field>, 'DUMMY2' FROM <table_name>;

El segundo enfoque funcionará para ambos casos.

Si sigue la ruta INSERTAR VALORES para insertar varias filas, asegúrese de delimitar los VALORES en conjuntos usando paréntesis, por lo tanto:

INSERT INTO `receiving_table`
  (id,
  first_name,
  last_name)
VALUES 
  (1002,'Charles','Babbage'),
  (1003,'George', 'Boole'),
  (1001,'Donald','Chamberlin'),
  (1004,'Alan','Turing'),
  (1005,'My','Widenius');

De lo contrario, MySQL objeta que "el recuento de columnas no coincide con el recuento de valores en la fila 1" y terminas escribiendo una publicación trivial cuando finalmente descubres qué hacer al respecto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top