Bir tablonun tüm değerlerini SQL'deki başka bir tabloya ekle


128

Bir tablonun tüm değerlerini diğerine eklemeye çalışıyorum. Ancak insert ifadesi değerleri kabul ediyor, ancak initial_Table'dan bir seçim * kabul etmesini istiyorum. Mümkün mü?

Yanıtlar:


262

İnsert deyiminin aslında bunu yapmak için bir sözdizimi vardır. Ancak "*" seçmek yerine sütun adlarını belirtirseniz çok daha kolaydır:

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

Bunu açıklığa kavuştursam iyi olur çünkü bir nedenden dolayı bu gönderi birkaç olumsuz oy alıyor.

INSERT INTO ... SELECT FROM sözdizimi, içine eklediğiniz tablonun (yukarıdaki örneğimde "yeni_tablo") zaten mevcut olduğu durum içindir. Başkalarının da söylediği gibi, SELECT ... INTO sözdizimi, komutun bir parçası olarak yeni tabloyu oluşturmak istediğiniz zamanlar içindir.

Yeni tablonun komutun bir parçası olarak yaratılması gerekip gerekmediğini belirtmediniz, bu nedenle INSERT INTO ... SELECT FROM, hedef tablonuz zaten mevcutsa iyi olacaktır.


3
Ne--? Birisi bana bu gönderinin neden olumsuz oylar ürettiğini açıklayan bir yorum bırakmak ister? OPs sorusunda, yeni tablonun sorgunun bir parçası olarak oluşturulması gerektiğini belirten hiçbir şey görmüyorum.
Matt Hamilton

Bu, bütünlük kısıtlaması ihlallerini nasıl ele alır? Örneğin, bir benzersiz yinelenirse sorguyu durdurur mu yoksa yalnızca o belirli girişi atlar mı?
Martin Dale Lyness

Bir hata atıp işlemi geri alacağına inanıyorum, yani hiçbir şey kopyalanmayacak. Yine de test etmeye değer.
Matt Hamilton

25

Bunu dene:

INSERT INTO newTable SELECT * FROM initial_Table

2
Kimlik
sütunumuz

Kimlikli bu senaryo için, kimlik değerlerini eklemek için önce SET IDENTITY_INSERT table_name ON'u ve sonunda off ile aynısını ekleyin.
Juan

13

Aşağıdaki gibi bir Alt sorgu kullanarak ekleyebilirsiniz:

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



4

Herhangi bir kod yazmak zorunda olmadığınız daha kolay bir yol var (Test İçin İdeal veya Tek seferlik güncellemeler):

Aşama 1

  • Gezginde tabloya sağ tıklayın ve "İlk 100 satırı düzenle" yi seçin;

Adım 2

  • Daha sonra istediğiniz satırları seçebilir ( Ctrl + Tıkla veya Ctrl + A ) ve Sağ Tıkla ve Kopyala ( Not : Bir " nerede " koşulu eklemek istiyorsanız , Izgaraya Sağ Tıklayın -> Bölme -> Şimdi SQL Sorguyu düzenleyebilir ve NEREDE koşulu ekleyebilir, ardından tekrar Sağ Tıklama -> SQL Yürütme, gerekli satırlarınız altta seçilebilir olacaktır)

Aşama 3

  • Hedef tablo için Adım 1'i izleyin.

4. adım

  • Şimdi ızgaranın sonuna gidin ve son satırın ilk sütunda bir yıldız işareti (*) olacaktır (Bu satır yeni giriş eklemek içindir). Tüm satırı seçmek için buna tıklayın ve ardından YAPIŞTIR ( Ctrl + V ). Hücrenin bir Kırmızı Asterix'i olabilir (kaydedilmediğini gösterir)

Adım 5

  • Ekleme ifadesini tetiklemek için başka herhangi bir satıra tıklayın (Kırmızı Asterix kaybolacaktır)

Not - 1 : Sütunlar Hedef tablodaki gibi doğru sırada değilse, her zaman Adım 2'yi takip edebilir ve Hedef tablodakiyle aynı sırayla Sütunları Seçebilirsiniz.

Not - 2 - Kimlik sütunlarınız varsa, SET IDENTITY_INSERT sometableWithIdentity ONaşağıdaki adımları uygulayın ve ardından yukarıdaki adımları izleyin ve sonundaSET IDENTITY_INSERT sometableWithIdentity OFF


3

Çok fazla veriyi kalıcı olarak aktarıyorsanız, yani geçici bir tablo doldurmuyorsanız, SQL Server Verileri Alma / Verme'yi kullanmanızı tavsiye ederim. tablodan tabloya eşlemeler için .

İçe / Dışa Aktarma aracı, eşlemenizde tür dönüşümleriniz ve olası değer kesmeleriniz olduğunda genellikle düz SQL'den daha iyidir. Genel olarak, eşlemeniz ne kadar karmaşıksa, doğrudan SQL yerine Entegrasyon Hizmetleri (SSIS) gibi bir ETL aracı kullanırsınız.

Alma / Verme aracı aslında bir SSIS sihirbazıdır ve çalışmanızı bir dtsx paketi olarak kaydedebilirsiniz.


2

Sanırım bu ifade istediğinizi yapabilir.

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")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.