una - insertar varios registros en sql




Insertar en... valores(SELECCIONAR... DESDE...) (15)

Estoy tratando de INSERT INTO una tabla usando la entrada de otra tabla. Aunque esto es completamente factible para muchos motores de base de datos, siempre me cuesta trabajo recordar la sintaxis correcta para el motor SQL del día ( MySQL , Oracle , SQL Server , Informix y DB2 ).

¿Existe una sintaxis de viñeta de plata proveniente de un estándar de SQL (por ejemplo, SQL-92 ) que me permita insertar los valores sin preocuparme por la base de datos subyacente?


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

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

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


Aquí es cómo insertar desde varias tablas. Este ejemplo en particular es donde tiene una tabla de asignación 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 se entiende la idea. La coincidencia en algo que no sea un Id. Es necesario cuando el Id es una columna de identidad y es desconocido).


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 Insert (), y solo selecciona qué valores van en la tabla.


En lugar de la parte de VALUES de la consulta INSERT , simplemente use la consulta SELECT como se muestra a continuación.

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

Esto funcionó para mí:

insert into table1 select * from table2

La oración es un poco diferente de la de Oracle.


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

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

INSERT INTO table1
SELECT  col1, col2
FROM    table2

Esto NO col2 (no se especifica el valor para col2 ):

INSERT INTO table1
SELECT  col1
FROM    table2

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


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 usado siguen esta sintaxis, a saber, DB2 , SQL Server , MY SQL , PostgresQL


La mejor manera de insertar múltiples 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)

Para Microsoft SQL Server, recomendaré aprender a interpretar el SYNTAX proporcionado 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 ("Usar las opciones SELECCIONAR y EJECUTAR para ejecutar datos de otras tablas") si le resulta difícil interpretar la sintaxis dada 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 para cualquier otro RDBMS disponible allí. No tiene sentido recordar toda la sintaxis de todos los productos IMO.


Para agregar algo en la primera respuesta, cuando queremos solo algunos 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);

Puede intentar esto si desea insertar todas las columnas utilizando la tabla SELECT * INTO .

SELECT  *
INTO    Table2
FROM    Table1;

Si va a la ruta INSERTAR VALORES para insertar varias filas, asegúrese de delimitar los VALORES en conjuntos utilizando paréntesis, por lo que:

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, los objetos de MySQL que "el recuento de columnas no coincide con el valor del recuento en la fila 1", terminan escribiendo una publicación trivial cuando finalmente descubren qué hacer al respecto.


Tratar:

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2  

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

Definitivamente funciona para:

  • Oráculo
  • MS SQL Server
  • MySQL
  • Postgres
  • SQLite v3
  • Teradata
  • DB2
  • Sybase
  • Vertica
  • HSQLDB
  • H2
  • AWS RedShift
  • SAP HANA

INSERT INTO FIRST_TABLE_NAME (COLUMN_NAME)
SELECT  COLUMN_NAME
FROM    ANOTHER_TABLE_NAME 
WHERE CONDITION;

select *
into tmp
from orders

Se ve bien, pero funciona solo si tmp no existe (lo crea y se llena). (Servidor SQL)

Para insertar en la 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




ansi-sql-92