Insérer toutes les valeurs d'une table dans une autre table en SQL

128

J'essaye d'insérer toutes les valeurs d'une table dans une autre. Mais l'instruction insert accepte les valeurs, mais je voudrais qu'elle accepte un select * de la table_initial. Est-ce possible?

Vinod
la source

Réponses:

262

L'instruction insert a en fait une syntaxe pour faire exactement cela. C'est beaucoup plus facile si vous spécifiez les noms de colonnes plutôt que de sélectionner "*":

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

Je ferais mieux de clarifier cela parce que pour une raison quelconque, ce message reçoit quelques votes négatifs.

La syntaxe INSERT INTO ... SELECT FROM est utilisée lorsque la table dans laquelle vous insérez ("new_table" dans mon exemple ci-dessus) existe déjà. Comme d'autres l'ont dit, la syntaxe SELECT ... INTO est utilisée lorsque vous souhaitez créer la nouvelle table dans le cadre de la commande.

Vous n'avez pas spécifié si la nouvelle table doit être créée dans le cadre de la commande, donc INSERT INTO ... SELECT FROM devrait convenir si votre table de destination existe déjà.

Matt Hamilton
la source
3
Quoi ...? Quelqu'un veut me laisser un commentaire expliquant pourquoi ce message génère des votes à la baisse? Je ne vois rien dans la question OPs qui spécifie que la nouvelle table doit être créée dans le cadre de la requête.
Matt Hamilton
Comment cela gère-t-il les violations de contraintes d'intégrité? Par exemple, si un unique est dupliqué, arrête-t-il la requête ou ignore-t-il simplement cette entrée particulière?
Martin Dale Lyness
Je pense que cela générera une erreur et annulera la transaction, ce qui signifie que rien n'est copié. Cela vaut la peine d'être testé.
Matt Hamilton
25

Essaye ça:

INSERT INTO newTable SELECT * FROM initial_Table
FibreCode
la source
2
Ne fonctionne pas lorsque vous utilisez des étoiles lorsque nous avons une colonne d'identité
Mohsen Tavoosi محسن طاوسی
Pour ce scénario avec identité, ajoutez d'abord SET IDENTITY_INSERT table_name ON et le même avec off à la fin pour insérer les valeurs d'identité.
Juan
13

Vous pouvez insérer à l'aide d'une sous-requête comme suit:

INSERT INTO new_table (columns....)
SELECT columns....
FROM initial_table where column=value
sornalingam
la source
8

D' ici:

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

Il existe un moyen plus simple de ne pas saisir de code (idéal pour les tests ou les mises à jour ponctuelles):

Étape 1

  • Faites un clic droit sur le tableau dans l'explorateur et sélectionnez "Modifier les 100 premières lignes";

Étape 2

  • Ensuite, vous pouvez sélectionner les lignes que vous voulez ( Ctrl + Clic ou Ctrl + A ), et faire un clic droit et copier ( Remarque : Si vous voulez ajouter une condition " ", cliquez avec le bouton droit sur Grille -> Volet -> SQL maintenant vous pouvez modifier la requête et ajouter la condition WHERE, puis cliquez à nouveau avec le bouton droit -> Exécuter SQL, vos lignes requises seront disponibles pour être sélectionnées en bas)

Étape 3

  • Suivez l'étape 1 pour le tableau cible.

Étape 4

  • Allez maintenant à la fin de la grille et la dernière ligne aura un astérisque (*) dans la première colonne (Cette ligne sert à ajouter une nouvelle entrée). Cliquez dessus pour sélectionner cette ligne entière, puis COLLER ( Ctrl + V ). La cellule peut avoir un astérix rouge (indiquant qu'elle n'est pas enregistrée)

Étape 5

  • Cliquez sur n'importe quelle autre ligne pour déclencher l'instruction d'insertion (l'astérix rouge disparaîtra)

Remarque - 1 : Si les colonnes ne sont pas dans le bon ordre comme dans le tableau cible, vous pouvez toujours suivre l'étape 2 et sélectionner les colonnes dans le même ordre que dans le tableau cible

Remarque - 2 - Si vous avez des colonnes d'identité, exécutez SET IDENTITY_INSERT sometableWithIdentity ONpuis suivez les étapes ci-dessus et, à la fin, exécutezSET IDENTITY_INSERT sometableWithIdentity OFF

Mahesh
la source
3

Si vous transférez un grand nombre de données de manière permanente, c'est-à-dire ne remplissez pas une table temporaire, je vous recommande d'utiliser SQL Server Import / Export Data pour les mappages table à table.

L'outil d'importation / exportation est généralement meilleur que SQL simple lorsque vous avez des conversions de type et une troncature de valeur possible dans votre mappage. En général, plus votre mappage est complexe, plus vous utilisez un outil ETL comme Integration Services (SSIS) au lieu de SQL direct.

L'outil d'importation / exportation est en fait un assistant SSIS et vous pouvez enregistrer votre travail en tant que package dtsx.

mika
la source
2

Je pense que cette déclaration pourrait faire ce que vous voulez.

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