Estoy intentando INSERT INTO
una tabla usando la entrada de otra tabla. Aunque esto es completamente factible para muchos motores de bases de datos, siempre me parece difícil recordar la sintaxis correcta para el SQL
motor del día ( MySQL , Oracle , SQL Server , Informix y DB2 ).
¿Existe una sintaxis de bala de plata 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?
sql
database
syntax
database-agnostic
ansi-sql-92
Claude Houle
fuente
fuente
Respuestas:
Tratar:
Este es el estándar ANSI SQL y debería funcionar en cualquier DBMS
Definitivamente funciona para:
fuente
La respuesta de Claude Houle : debería funcionar bien, y también puede tener múltiples columnas y otros datos:
Solo he usado esta sintaxis con Access, SQL 2000/2005 / Express, MySQL y PostgreSQL, por lo que deberían cubrirse. También debería funcionar con SQLite3.
fuente
Para obtener solo un valor en un valor múltiple
INSERT
de otra tabla, hice lo siguiente en SQLite3:fuente
INSERT
es unaVALUES
o unaSELECT
declaración, no ambos.INSERT INTO ... VALUES ([expr], [expr], ...)
y una de las rutas[expr]
es{{NOT} EXISTS} ([select-stmt])
- tenga en cuenta que la parálisis alrededor de la instrucción select es obligatoria (lo que{}
significa opcional)Ambas respuestas que veo funcionan bien en Informix específicamente, y son básicamente SQL estándar. Es decir, la notación:
funciona bien con Informix y, esperaría, todos los DBMS. (Hace una vez, hace 5 años o más, este es el tipo de cosas que MySQL no siempre admitió; ahora tiene un soporte decente para este tipo de sintaxis SQL estándar y, AFAIK, funcionaría bien en esta notación). es opcional pero indica las columnas de destino en secuencia, por lo que la primera columna del resultado de SELECT entrará en la primera columna de la lista, etc. En ausencia de la lista de columnas, la primera columna del resultado de SELECT entrará en 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 usar la siguiente notación para identificar una tabla:
Es decir, puede especificar una base de datos, opcionalmente identificando 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 al propietario. Por lo tanto, en Informix, cualquiera de las siguientes notaciones podría identificar una tabla:
El propietario en general no necesita ser citado; sin embargo, si utiliza comillas, debe escribir correctamente el nombre del propietario; se distingue entre mayúsculas y minúsculas. Es decir:
Todos identifican la misma tabla. Con Informix, hay una complicación leve con las bases de datos MODE ANSI, donde los nombres de los propietarios generalmente se convierten en mayúsculas (informix es la excepción). Es decir, en una base de datos MODE ANSI (no utilizada comúnmente), podría escribir:
y el nombre del propietario en el catálogo del sistema sería "ALGUIEN", en lugar de "alguien". Si encierra el nombre del propietario entre comillas dobles, actúa como un identificador delimitado. Con SQL estándar, los identificadores delimitados se pueden usar en muchos lugares. Con Informix, puede usarlos solo alrededor de nombres de propietarios: en otros contextos, Informix trata las cadenas de comillas simples y dobles como cadenas, en lugar de separar las cadenas de comillas simples como cadenas y las cadenas de 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 identificadores delimitados y las comillas simples siempre rodean cadenas).
Tenga en cuenta que MS SQL Server logra usar [identificadores delimitados] encerrados entre corchetes. Me parece extraño, y ciertamente no es parte del estándar SQL.
fuente
Para agregar algo en la primera respuesta, cuando queremos solo unos pocos registros de otra tabla (en este ejemplo, solo uno):
fuente
La mayoría de las bases de datos siguen la sintaxis básica,
Cada base de datos que he utilizado siga esta sintaxis es decir,
DB2
,SQL Server
,MY SQL
,PostgresQL
fuente
En lugar de
VALUES
parte de laINSERT
consulta, solo use laSELECT
consulta como se muestra a continuación.fuente
Dos enfoques para insertar en una subconsulta de selección.
1. Enfoque para la subconsulta con SELECT que devuelve resultados con una fila .
En este caso, se supone que la subconsulta SELECT devuelve solo una fila de resultados según la condición WHERE o las funciones agregadas de SQL como SUM, MAX, AVG, etc. De lo contrario, arrojará un error
2. Enfoque para la subconsulta con SELECT que devuelve resultados con varias filas .
El segundo enfoque funcionará para ambos casos.
fuente
Esto se puede hacer sin especificar las columnas en la
INSERT INTO
parte si está proporcionando valores para todas las columnas en elSELECT
parte.Digamos que table1 tiene dos columnas. Esta consulta debería funcionar:
Esto NO FUNCIONARÍA (
col2
no se especifica el valor para ):Estoy usando MS SQL Server. No sé cómo funcionan otros RDMS.
fuente
Este es otro ejemplo usando valores con select:
fuente
Inserción simple cuando se conoce la secuencia de columnas de la tabla:
Inserción simple que menciona la columna:
Inserción masiva cuando el número de columnas seleccionadas de una tabla (# tabla2) es igual a la tabla de inserción (Tabla1)
Inserción masiva cuando desea insertar solo en la columna deseada de una tabla (tabla1):
fuente
Aquí hay otro ejemplo donde la fuente se toma usando más de una tabla:
fuente
Simplemente use paréntesis para la cláusula SELECT en INSERT. Por ejemplo así:
fuente
Aquí se explica cómo insertar desde varias tablas. Este ejemplo particular es donde tiene una tabla de mapeo en un escenario de muchos a muchos:
(Me doy cuenta de que la coincidencia en el nombre del alumno puede devolver más de un valor, pero se entiende la idea. La coincidencia en algo que no sea un Id es necesaria cuando el Id es una columna de Identidad y se desconoce).
fuente
Esto funciona en todos los DBMS
fuente
Puede intentar esto si desea insertar todas las columnas usando la
SELECT * INTO
tabla.fuente
De hecho, prefiero lo siguiente en SQL Server 2008:
Elimina el paso de agregar el conjunto Insertar () y simplemente selecciona qué valores van en la tabla.
fuente
Esto funcionó para mí:
La oración es un poco diferente de la de Oracle.
fuente
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
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 dada en la parte superior de la página.
Esto debería ser aplicable para cualquier otro RDBMS disponible allí. No tiene sentido recordar toda la sintaxis de todos los productos IMO.
fuente
fuente
Se ve bien, pero funciona solo si tmp no existe (lo crea y lo llena). (Servidor SQL)
Para insertar en la tabla tmp existente:
fuente
La mejor manera de insertar múltiples registros de cualquier otra tabla.
fuente
Si va a la ruta INSERTAR VALORES para insertar varias filas, asegúrese de delimitar los VALORES en conjuntos usando paréntesis, de modo que:
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.
fuente
SI desea insertar algunos datos en una tabla sin querer escribir el nombre de la columna.
Donde están las mesas:
Resultado:
fuente
En informix funciona como dijo Claude:
fuente
Postgres admite a continuación: crear la tabla company.monitor2 como select * from company.monitor;
fuente