Inserisci tutti i valori di una tabella in un'altra tabella in SQL


128

Sto cercando di inserire tutti i valori di una tabella in un'altra. Ma l'istruzione insert accetta valori, ma vorrei che accettasse un select * dalla tabella_iniziale. È possibile?

Risposte:


262

L'istruzione insert in realtà ha una sintassi per fare proprio questo. È molto più semplice se specifichi i nomi delle colonne anziché selezionare "*":

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

Chiarirei meglio questo perché per qualche motivo questo post sta ottenendo alcuni voti negativi.

La sintassi INSERT INTO ... SELECT FROM è per quando la tabella che stai inserendo ("new_table" nel mio esempio sopra) esiste già. Come altri hanno già detto, la sintassi SELECT ... INTO è per quando si desidera creare la nuova tabella come parte del comando.

Non hai specificato se la nuova tabella deve essere creata come parte del comando, quindi INSERT INTO ... SELECT FROM dovrebbe andare bene se la tabella di destinazione esiste già.


3
Wha--? Qualcuno vuole lasciarmi un commento che spiega perché questo post sta generando voti negativi? Non vedo nulla nella domanda OP che specifica che la nuova tabella dovrebbe essere creata come parte della query.
Matt Hamilton,

In che modo gestisce le violazioni dei vincoli di integrità? Ad esempio, se un unico viene duplicato interrompe la query o salta semplicemente quella voce specifica?
Martin Dale Lyness,

Credo che genererà un errore e ripristinerà la transazione, il che significa che nulla viene copiato. Vale la pena testarlo però.
Matt Hamilton,

25

Prova questo:

INSERT INTO newTable SELECT * FROM initial_Table

2
Non funziona quando si usano le stelle quando abbiamo una colonna di identità
Mohsen Tavoosi محسن طاوس

Per questo scenario con identità aggiungere SET IDENTITY_INSERT table_name ON prima e lo stesso con off alla fine per inserire i valori di identità.
Juan

13

È possibile inserire una query secondaria come segue:

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



4

Esiste un modo più semplice in cui non è necessario digitare alcun codice (ideale per i test o gli aggiornamenti di una volta):

Passo 1

  • Fare clic con il tasto destro sulla tabella di Explorer e selezionare "Modifica le prime 100 righe";

Passo 2

  • Quindi è possibile selezionare le righe desiderate ( Ctrl + Clic o Ctrl + A ), quindi fare clic con il pulsante destro e Copia ( Nota : se si desidera aggiungere una condizione " dove ", fare clic con il tasto destro su Griglia -> Riquadro -> SQL Now è possibile modificare la query e aggiungere la condizione WHERE, quindi fare nuovamente clic con il pulsante destro del mouse -> Esegui SQL, le righe richieste saranno disponibili per selezionare in basso)

Passaggio 3

  • Seguire il passaggio 1 per la tabella di destinazione.

Passaggio 4

  • Ora vai alla fine della griglia e l'ultima riga avrà un asterisco (*) nella prima colonna (Questa riga serve per aggiungere una nuova voce). Fai clic su quello per selezionare l'intera riga e poi INCOLLA ( Ctrl + V ). La cella potrebbe avere un Asterix rosso (che indica che non è stato salvato)

Passaggio 5

  • Fai clic su qualsiasi altra riga per attivare l'istruzione insert (Red Asterix scomparirà)

Nota - 1 : se le colonne non sono nell'ordine corretto come nella tabella Target, puoi sempre seguire il Passaggio 2 e selezionare le colonne nello stesso ordine della tabella Target

Nota - 2 - Se si dispone di colonne Identity, eseguire SET IDENTITY_INSERT sometableWithIdentity ONe quindi seguire i passaggi precedenti e alla fine eseguireSET IDENTITY_INSERT sometableWithIdentity OFF


3

Se si trasferiscono molti dati in modo permanente, ovvero non si popola una tabella temporanea, si consiglia di utilizzare i dati di importazione / esportazione di SQL Server per i mapping da tabella a tabella.

Lo strumento di importazione / esportazione è in genere migliore di SQL semplice quando si hanno conversioni di tipo e possibili troncamenti di valore nella mappatura. In generale, più complessa è la mappatura, più produttiva si utilizza uno strumento ETL come Integration Services (SSIS) invece di SQL diretto.

Lo strumento di importazione / esportazione è in realtà una procedura guidata SSIS ed è possibile salvare il proprio lavoro come pacchetto dtsx.


2

Penso che questa affermazione potrebbe fare quello che vuoi.

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")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.