テーブルのすべての値をSQLの別のテーブルに挿入する


128

1つのテーブルのすべての値を別のテーブルに挿入しようとしています。しかし、insertステートメントは値を受け入れますが、initial_Tableからのselect *を受け入れたいと思います。これは可能ですか?

回答:


262

insertステートメントには、実際にそれを行うための構文があります。ただし、「*」を選択するよりも列名を指定する方がはるかに簡単です。

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

何らかの理由でこの投稿がいくつかの反対票を得ているので、私はこれを明確にした方がいいです。

INSERT INTO ... SELECT FROM構文は、挿入するテーブル(上記の例では「new_table」)がすでに存在する場合に使用します。他の人が言ったように、SELECT ... INTO構文は、コマンドの一部として新しいテーブルを作成する場合に使用します。

コマンドの一部として新しいテーブルを作成する必要があるかどうかを指定しなかったため、宛先テーブルが既に存在する場合は、INSERT INTO ... SELECT FROMで問題ありません。


3
えっ?誰かがこの投稿が反対票を投じている理由を説明するコメントを残したいですか?クエリの一部として新しいテーブルを作成する必要があることを指定するOPの質問には何も表示されません。
マットハミルトン

これは整合性制約違反をどのように処理しますか?たとえば、一意が重複している場合、クエリを停止するか、その特定のエントリをスキップしますか?
マーティンデールライネス2009年

エラーがスローされ、トランザクションがロールバックされると思います。つまり、何もコピーされません。しかし価値のあるテスト。
マットハミルトン

25

これを試して:

INSERT INTO newTable SELECT * FROM initial_Table

2
ID列があるときに星を使用すると機能しない
Mohsen Tavoosiمحسنطاوسی

このIDのシナリオの場合、最初にSET IDENTITY_INSERT table_name ONを追加し、最後に同じID値を挿入するためにoffを追加します。
フアン

13

次のようにサブクエリを使用して挿入できます。

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



4

コードを入力する必要がない簡単な方法があります(テストまたは1回限りの更新に最適)。

ステップ1

  • エクスプローラーでテーブルを右クリックし、[上位100行を編集]を選択します。

ステップ2

  • 次に、必要な行を選択し(Ctrl +クリックまたはCtrl + A)、右クリックしてコピーすることができます(:「where」条件を追加する場合は、グリッドを右クリック->ペイン-> SQL Nowクエリを編集してWHERE条件を追加し、もう一度右クリック-> SQLを実行すると、必要な行が下部で選択できるようになります)

ステップ3

  • ターゲットテーブルの手順1に従います。

ステップ4

  • グリッドの最後に移動すると、最後の行の最初の列にアスタリスク(*)が表示されます(この行は新しいエントリを追加するためのものです)。それをクリックして行全体を選択し、次にPASTE(Ctrl + V)を選択します。セルに赤いアステリックスがある可能性があります(保存されていないことを示します)

手順5

  • 他の行をクリックして挿入ステートメントをトリガーします(赤いアステリックスが消えます)

注-1:列がターゲットテーブルのように正しい順序になっていない場合は、いつでもステップ2に従い、ターゲットテーブルと同じ順序で列を選択できます。

注-2 -Identity列がある場合は、実行SET IDENTITY_INSERT sometableWithIdentity ONしてから上記の手順に従い、最後に実行します。SET IDENTITY_INSERT sometableWithIdentity OFF


3

大量のデータを永続的に転送する場合、つまり一時テーブルにデータを入力しない場合は、テーブルからテーブルへのマッピングにSQL Serverインポート/エクスポートデータを使用することをお勧めします

マッピングに型変換と可能な値の切り捨てがある場合、インポート/エクスポートツールは通常、ストレートSQLよりも優れています。一般に、マッピングが複雑になるほど、直接SQLの代わりにIntegration Services(SSIS)などのETLツールを使用する生産性が向上します。

インポート/エクスポートツールは実際にはSSISウィザードであり、作業をdtsxパッケージとして保存できます。


2

この文はあなたが望むことをするかもしれないと思います。

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")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.