Masukkan semua nilai tabel ke tabel lain di SQL

128

Saya mencoba memasukkan semua nilai dari satu tabel ke yang lain. Tetapi pernyataan masukkan menerima nilai, tetapi saya ingin menerima * pilih * dari initial_Table. Apakah ini mungkin?

Vinod
sumber

Jawaban:

262

Pernyataan insert sebenarnya memiliki sintaks untuk melakukan hal itu. Akan jauh lebih mudah jika Anda menentukan nama kolom daripada memilih "*":

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

Saya lebih baik mengklarifikasi ini karena beberapa alasan posting ini mendapatkan beberapa suara turun.

INSERT INTO ... SELECT FROM syntax adalah ketika tabel tempat Anda memasukkan ("new_table" pada contoh saya di atas) sudah ada. Seperti yang orang lain katakan, sintaks SELECT ... INTO adalah ketika Anda ingin membuat tabel baru sebagai bagian dari perintah.

Anda tidak menentukan apakah tabel baru perlu dibuat sebagai bagian dari perintah, jadi INSERT INTO ... SELECT FROM akan baik-baik saja jika tabel tujuan Anda sudah ada.

Matt Hamilton
sumber
3
Apa-- Seseorang ingin memberi saya komentar yang menjelaskan mengapa posting ini menghasilkan suara menurun? Saya tidak melihat apa pun di pertanyaan OP yang menentukan bahwa tabel baru harus dibuat sebagai bagian dari kueri.
Matt Hamilton
Bagaimana ini menangani pelanggaran batasan integritas? Misalnya, jika unik digandakan apakah itu menghentikan kueri atau hanya melewatkan entri tertentu?
Martin Dale Lyness
Saya percaya itu akan menimbulkan kesalahan dan memutar kembali transaksi, yang berarti tidak ada yang disalin. Layak diuji.
Matt Hamilton
25

Coba ini:

INSERT INTO newTable SELECT * FROM initial_Table
FibreCode
sumber
2
Tidak berfungsi saat menggunakan bintang ketika kami memiliki kolom identitas
Mohsen Tavoosi محسن طاوسی
Untuk skenario ini dengan identitas, tambahkan SET IDENTITY_INSERT table_name ON pertama dan yang sama dengan off di akhir untuk memasukkan nilai identitas.
Juan
13

Anda dapat menyisipkan menggunakan Sub-permintaan sebagai berikut:

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

Dari sini:

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

Ada cara yang lebih mudah di mana Anda tidak perlu mengetikkan kode apa pun (Ideal untuk Pengujian atau pembaruan satu kali):

Langkah 1

  • Klik kanan pada tabel di explorer dan pilih "Edit top 100 rows";

Langkah 2

  • Kemudian Anda dapat memilih baris yang Anda inginkan ( Ctrl + Klik atau Ctrl + A ), dan Klik kanan dan Salin ( Catatan : Jika Anda ingin menambahkan kondisi "di mana ", maka Klik Kanan pada Kotak -> Panel -> SQL Sekarang Anda dapat mengedit Kueri dan menambahkan kondisi WHERE, lalu Klik Kanan lagi -> Jalankan SQL, baris yang diperlukan Anda akan tersedia untuk dipilih di bagian bawah)

Langkah 3

  • Ikuti Langkah 1 untuk tabel target.

Langkah 4

  • Sekarang pergi ke ujung grid dan baris terakhir akan memiliki asterix (*) di kolom pertama (Baris ini adalah untuk menambah entri baru). Klik itu untuk memilih seluruh baris dan kemudian PASTE ( Ctrl + V ). Sel mungkin memiliki Asterix Merah (menunjukkan bahwa itu tidak disimpan)

Langkah 5

  • Klik pada baris lain untuk memicu pernyataan penyisipan (Red Asterix akan menghilang)

Catatan - 1 : Jika kolom tidak dalam urutan yang benar seperti pada tabel Target, Anda selalu dapat mengikuti Langkah 2, dan Pilih Kolom dalam urutan yang sama seperti pada tabel Target

Catatan - 2 - Jika Anda memiliki kolom Identitas kemudian jalankan SET IDENTITY_INSERT sometableWithIdentity ONdan ikuti langkah-langkah di atas, dan pada akhirnya jalankanSET IDENTITY_INSERT sometableWithIdentity OFF

Mahesh
sumber
3

Jika Anda mentransfer banyak data secara permanen, yaitu tidak mengisi tabel temp, saya akan merekomendasikan menggunakan SQL Server Impor / Ekspor Data untuk pemetaan table-to-table.

Alat Impor / Ekspor biasanya lebih baik daripada SQL langsung ketika Anda memiliki konversi jenis dan kemungkinan pemotongan nilai dalam pemetaan Anda. Secara umum, semakin kompleks pemetaan Anda, semakin produktif Anda menggunakan alat ETL seperti Integration Services (SSIS) daripada SQL langsung.

Alat Impor / Ekspor sebenarnya adalah panduan SSIS, dan Anda dapat menyimpan pekerjaan Anda sebagai paket dtsx.

mika
sumber
2

Saya pikir pernyataan ini mungkin melakukan apa yang Anda inginkan.

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