Insertar todos los valores de una tabla en otra tabla en SQL


128

Estoy tratando de insertar todos los valores de una tabla en otra. Pero la instrucción insert acepta valores, pero me gustaría que acepte un select * de initial_Table. es posible?

Respuestas:


262

La declaración de inserción en realidad tiene una sintaxis para hacer precisamente eso. Sin embargo, es mucho más fácil si especifica los nombres de columna en lugar de seleccionar "*":

INSERT INTO new_table (Foo, Bar, Fizz, Buzz)
SELECT Foo, Bar, Fizz, Buzz
FROM initial_table
-- optionally WHERE ...

Mejor aclarar esto porque, por alguna razón, esta publicación está recibiendo algunos votos negativos.

La sintaxis INSERT INTO ... SELECT FROM es para cuando la tabla en la que está insertando ("new_table" en mi ejemplo anterior) ya existe. Como han dicho otros, la sintaxis SELECT ... INTO es para cuando desea crear la nueva tabla como parte del comando.

No especificó si la nueva tabla debe crearse como parte del comando, por lo que INSERT INTO ... SELECT FROM debería estar bien si su tabla de destino ya existe.


3
Que--? ¿Alguien quiere dejarme un comentario explicando por qué esta publicación está generando votos negativos? No veo nada en la pregunta de OP que especifique que la nueva tabla debe crearse como parte de la consulta.
Matt Hamilton

¿Cómo maneja esto las violaciones de restricciones de integridad? Por ejemplo, si un único está duplicado, ¿detiene la consulta o simplemente omite esa entrada en particular?
Martin Dale Lyness

Creo que arrojará un error y revertirá la transacción, lo que significa que no se copia nada. Aunque vale la pena probarlo.
Matt Hamilton

25

Prueba esto:

INSERT INTO newTable SELECT * FROM initial_Table

2
No funciona cuando se usan estrellas cuando tenemos una columna de identidad
Mohsen Tavoosi محسن طاوسی

Para este escenario con identidad, agregue SET IDENTITY_INSERT table_name ON primero y lo mismo con off al final para insertar los valores de identidad.
Juan

13

Puede insertar usando una subconsulta de la siguiente manera:

INSERT INTO new_table (columns....)
SELECT columns....
FROM initial_table where column=value



4

Hay una manera más fácil de no tener que escribir ningún código (ideal para pruebas o actualizaciones únicas):

Paso 1

  • Haga clic derecho en la tabla en el explorador y seleccione "Editar las 100 filas superiores";

Paso 2

  • Luego puede seleccionar las filas que desee ( Ctrl + Click o Ctrl + A ), y hacer clic con el botón derecho y Copiar ( Nota : si desea agregar una condición de " dónde ", haga clic con el botón derecho en Cuadrícula -> Panel -> SQL ahora puede editar la consulta y agregar la condición WHERE, luego haga clic derecho nuevamente -> Ejecutar SQL, sus filas requeridas estarán disponibles para seleccionar en la parte inferior)

Paso 3

  • Siga el paso 1 para la tabla de destino.

Paso 4

  • Ahora vaya al final de la cuadrícula y la última fila tendrá un asterisco (*) en la primera columna (Esta fila es para agregar una nueva entrada). Haga clic en eso para seleccionar esa fila completa y luego PEGAR ( Ctrl + V ). La celda puede tener un asterisco rojo (lo que indica que no está guardado)

Paso 5

  • Haga clic en cualquier otra fila para activar la instrucción de inserción (el Asterix rojo desaparecerá)

Nota - 1 : si las columnas no están en el orden correcto como en la tabla de destino, siempre puede seguir el paso 2 y seleccionar las columnas en el mismo orden que en la tabla de destino

Nota - 2 - Si tiene columnas de identidad, ejecute SET IDENTITY_INSERT sometableWithIdentity ONy siga los pasos anteriores, y al final ejecuteSET IDENTITY_INSERT sometableWithIdentity OFF


3

Si está transfiriendo una gran cantidad de datos de forma permanente, es decir, no está completando una tabla temporal, le recomendaría utilizar los datos de importación / exportación de SQL Server para las asignaciones de tabla a tabla.

La herramienta Importar / Exportar suele ser mejor que el SQL directo cuando tiene conversiones de tipo y posible truncamiento de valores en su mapeo. En general, cuanto más complejo sea su mapeo, más productivo utilizará una herramienta ETL como Integration Services (SSIS) en lugar de SQL directo.

La herramienta Importar / Exportar es en realidad un asistente de SSIS, y puede guardar su trabajo como un paquete dtsx.


2

Creo que esta declaración podría hacer lo que quieras.

INSERT INTO newTableName (SELECT column1, column2, column3 FROM oldTable);

0
 Dim ofd As New OpenFileDialog
                ofd.Filter = "*.mdb|*.MDB"
                ofd.FilterIndex = (2)
                ofd.FileName = "bd1.mdb"
                ofd.Title = "SELECCIONE LA BASE DE DATOS ORIGEN (bd1.mdb)"
                ofd.ShowDialog()
                Dim conexion1 = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" + ofd.FileName
                Dim conn As New OdbcConnection()
                conn.ConnectionString = conexion1
                conn.Open()



            'EN ESTE CODIGO SOLO SE AGREGAN LOS DATOS'
            Dim ofd2 As New OpenFileDialog
            ofd2.Filter = "*.mdb|*.MDB"
            ofd2.FilterIndex = (2)
            ofd2.FileName = "bd1.mdb"
            ofd2.Title = "SELECCIONE LA BASE DE DATOS DESTINO (bd1.mdb)"
            ofd2.ShowDialog()
            Dim conexion2 = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" + ofd2.FileName
            Dim conn2 As New OdbcConnection()
            conn2.ConnectionString = conexion2
            Dim cmd2 As New OdbcCommand
            Dim CADENA2 As String

            CADENA2 = "INSERT INTO EXISTENCIA IN '" + ofd2.FileName + "' SELECT * FROM EXISTENCIA IN '" + ofd.FileName + "'"


            cmd2.CommandText = CADENA2
            cmd2.Connection = conn2
            conn2.Open()
            Dim dA2 As New OdbcDataAdapter
            dA2.SelectCommand = cmd2
            Dim midataset2 As New DataSet
            dA2.Fill(midataset2, "EXISTENCIA")
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.