Fügen Sie alle Werte einer Tabelle in eine andere Tabelle in SQL ein

127

Ich versuche, alle Werte einer Tabelle in eine andere einzufügen. Aber die insert-Anweisung akzeptiert Werte, aber ich möchte, dass sie ein select * aus der initial_Table akzeptiert. Ist das möglich?

Vinod
quelle

Antworten:

261

Die insert-Anweisung hat tatsächlich eine Syntax dafür. Es ist viel einfacher, wenn Sie die Spaltennamen angeben, anstatt "*" auszuwählen:

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

Ich sollte dies besser klarstellen, da dieser Beitrag aus irgendeinem Grund einige Abstimmungen erhält.

Die Syntax INSERT INTO ... SELECT FROM gilt für den Fall, dass die Tabelle, in die Sie einfügen ("new_table" in meinem obigen Beispiel), bereits vorhanden ist. Wie bereits erwähnt, dient die Syntax SELECT ... INTO dazu, wenn Sie die neue Tabelle als Teil des Befehls erstellen möchten.

Sie haben nicht angegeben, ob die neue Tabelle als Teil des Befehls erstellt werden muss. INSERT INTO ... SELECT FROM sollte daher in Ordnung sein, wenn Ihre Zieltabelle bereits vorhanden ist.

Matt Hamilton
quelle
3
Was--? Jemand möchte mir einen Kommentar hinterlassen, der erklärt, warum dieser Beitrag Abwärtsstimmen erzeugt? In der OP-Frage wird nichts angezeigt, das angibt, dass die neue Tabelle als Teil der Abfrage erstellt werden soll.
Matt Hamilton
Wie geht dies mit Verstößen gegen Integritätsbeschränkungen um? Wenn beispielsweise ein eindeutiges Objekt dupliziert wird, stoppt es die Abfrage oder überspringt es nur diesen bestimmten Eintrag?
Martin Dale Lyness
Ich glaube, es wird einen Fehler auslösen und die Transaktion zurücksetzen, was bedeutet, dass nichts kopiert wird. Es lohnt sich jedoch zu testen.
Matt Hamilton
25

Versuche dies:

INSERT INTO newTable SELECT * FROM initial_Table
FibreCode
quelle
2
Nicht funktionieren, wenn Sterne verwendet werden, wenn wir eine Identitätsspalte haben
Mohsen Tavoosi
Fügen Sie für dieses Szenario mit Identität zuerst SET IDENTITY_INSERT table_name ON und am Ende dasselbe mit off hinzu, um die Identitätswerte einzufügen.
Juan
13

Sie können mithilfe einer Unterabfrage Folgendes einfügen:

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

Von hier aus:

SELECT *
INTO new_table_name [IN externaldatabase] 
FROM old_tablename
Otávio Décio
quelle
4

Es gibt eine einfachere Möglichkeit, keinen Code einzugeben (ideal zum Testen oder für einmalige Updates):

Schritt 1

  • Klicken Sie im Explorer mit der rechten Maustaste auf die Tabelle und wählen Sie "Top 100 Zeilen bearbeiten".

Schritt 2

  • Anschließend können Sie die gewünschten Zeilen auswählen ( Strg + Klicken oder Strg + A ) und mit der rechten Maustaste klicken und kopieren ( Hinweis : Wenn Sie eine " Wo " -Bedingung hinzufügen möchten, klicken Sie mit der rechten Maustaste auf Raster -> Bereich -> SQL Now Sie können die Abfrage bearbeiten und die WHERE-Bedingung hinzufügen. Klicken Sie dann erneut mit der rechten Maustaste -> SQL ausführen. Die erforderlichen Zeilen können unten ausgewählt werden.

Schritt 3

  • Befolgen Sie Schritt 1 für die Zieltabelle.

Schritt 4

  • Gehen Sie nun zum Ende des Rasters und die letzte Zeile hat ein Sternchen (*) in der ersten Spalte (Diese Zeile dient zum Hinzufügen eines neuen Eintrags). Klicken Sie darauf, um die gesamte Zeile auszuwählen, und klicken Sie dann auf EINFÜGEN ( Strg + V ). Die Zelle hat möglicherweise einen roten Stern (zeigt an, dass sie nicht gespeichert ist).

Schritt 5

  • Klicken Sie auf eine andere Zeile, um die Einfügeanweisung auszulösen (das rote Sternchen verschwindet).

Hinweis - 1 : Wenn die Spalten nicht in der richtigen Reihenfolge wie in der Zieltabelle vorliegen, können Sie immer Schritt 2 ausführen und die Spalten in derselben Reihenfolge wie in der Zieltabelle auswählen

Hinweis - 2 - Wenn Sie Identitätsspalten haben, führen Sie die SET IDENTITY_INSERT sometableWithIdentity ONobigen Schritte aus und befolgen Sie sie. Führen Sie sie am Ende ausSET IDENTITY_INSERT sometableWithIdentity OFF

Mahesh
quelle
3

Wenn Sie viele Losdaten dauerhaft übertragen, dh keine temporäre Tabelle füllen, würde ich empfehlen, SQL Server-Import / Export-Daten für Zuordnungen von Tabelle zu Tabelle zu verwenden.

Das Import / Export-Tool ist normalerweise besser als reines SQL, wenn Sie Typkonvertierungen und mögliche Wertkürzungen in Ihrer Zuordnung haben. Je komplexer Ihre Zuordnung ist, desto produktiver ist im Allgemeinen die Verwendung eines ETL-Tools wie Integration Services (SSIS) anstelle von direktem SQL.

Das Import / Export-Tool ist eigentlich ein SSIS-Assistent, und Sie können Ihre Arbeit als dtsx-Paket speichern.

mika
quelle
2

Ich denke, diese Aussage könnte tun, was Sie wollen.

INSERT INTO newTableName (SELECT column1, column2, column3 FROM oldTable);
Chris Ballance
quelle
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")
JORGE
quelle