Wstaw wszystkie wartości z tabeli do innej tabeli w języku SQL

128

Próbuję wstawić wszystkie wartości z jednej tabeli do drugiej. Ale instrukcja insert akceptuje wartości, ale chciałbym, aby akceptowała wybór * z initial_Table. czy to możliwe?

Vinod
źródło

Odpowiedzi:

262

W rzeczywistości instrukcja insert ma do tego odpowiednią składnię. O wiele łatwiej jest jednak podać nazwy kolumn zamiast wybierać „*”:

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

Lepiej to wyjaśnię, ponieważ z jakiegoś powodu ten post otrzymuje kilka głosów negatywnych.

Składnia INSERT INTO ... SELECT FROM jest stosowana, gdy tabela, do której wstawiasz („nowa_tabela” w moim przykładzie powyżej) już istnieje. Jak powiedzieli inni, składnia SELECT ... INTO służy do tworzenia nowej tabeli jako części polecenia.

Nie określiłeś, czy nowa tabela ma zostać utworzona jako część polecenia, więc INSERT INTO ... SELECT FROM powinno wystarczyć, jeśli tabela docelowa już istnieje.

Matt Hamilton
źródło
3
Co ... Ktoś chce zostawić mi komentarz wyjaśniający, dlaczego ten post generuje głosy negatywne? W pytaniu PO nie widzę niczego, co określałoby, że nowa tabela powinna zostać utworzona jako część zapytania.
Matt Hamilton,
Jak to radzi sobie z naruszeniami ograniczeń integralności? Na przykład, jeśli unikat jest zduplikowany, czy zatrzymuje zapytanie, czy po prostu pomija ten konkretny wpis?
Martin Dale Lyness
Uważam, że spowoduje to błąd i cofnie transakcję, co oznacza, że ​​nic nie zostanie skopiowane. Warto jednak przetestować.
Matt Hamilton,
25

Spróbuj tego:

INSERT INTO newTable SELECT * FROM initial_Table
FibreCode
źródło
2
Nie działa, gdy używamy gwiazdek, gdy mamy kolumnę tożsamości
Mohsen Tavoosi محسن طاوسی
W tym scenariuszu z tożsamością dodaj najpierw SET IDENTITY_INSERT nazwa_tabeli ON i to samo z wyłącz na końcu, aby wstawić wartości tożsamości.
Juan
13

Możesz wstawić za pomocą zapytania podrzędnego w następujący sposób:

INSERT INTO new_table (columns....)
SELECT columns....
FROM initial_table where column=value
sornalingam
źródło
8

Od tutaj:

SELECT *
INTO new_table_name [IN externaldatabase] 
FROM old_tablename
Otávio Décio
źródło
4

Jest łatwiejszy sposób, w którym nie musisz wpisywać żadnego kodu (idealny do testowania lub jednorazowych aktualizacji):

Krok 1

  • Kliknij prawym przyciskiem myszy tabelę w eksploratorze i wybierz „Edytuj 100 pierwszych wierszy”;

Krok 2

  • Następnie możesz wybrać żądane wiersze ( Ctrl + kliknięcie lub Ctrl + A ), a następnie kliknąć prawym przyciskiem myszy i skopiować ( Uwaga : jeśli chcesz dodać warunek „ gdzie ”, kliknij prawym przyciskiem myszy na siatce -> okienko -> SQL teraz możesz edytować zapytanie i dodać warunek WHERE, a następnie ponownie kliknąć prawym przyciskiem myszy -> Wykonaj SQL, wymagane wiersze będą dostępne do wyboru na dole)

Krok 3

  • Wykonaj krok 1 dla tabeli docelowej.

Krok 4

  • Teraz przejdź do końca siatki, a ostatni wiersz będzie miał gwiazdkę (*) w pierwszej kolumnie (ten wiersz służy do dodania nowego wpisu). Kliknij, aby zaznaczyć cały wiersz, a następnie WKLEJ ( Ctrl + V ). Komórka może mieć czerwoną gwiazdkę (wskazującą, że nie jest zapisana)

Krok 5

  • Kliknij dowolny inny wiersz, aby wywołać instrukcję wstawiania (czerwona gwiazdka zniknie)

Uwaga - 1 : Jeśli kolumny nie są w odpowiedniej kolejności, jak w tabeli docelowej, zawsze możesz wykonać krok 2 i wybrać kolumny w tej samej kolejności, jak w tabeli docelowej

Uwaga - 2 - Jeśli masz kolumny tożsamości, wykonaj, SET IDENTITY_INSERT sometableWithIdentity ONa następnie wykonaj powyższe kroki, a na końcu wykonajSET IDENTITY_INSERT sometableWithIdentity OFF

Mahesh
źródło
3

Jeśli przenosisz dużo danych na stałe, tj. Nie zapełniasz tabeli tymczasowej, polecam użycie SQL Server Import / Export Data do mapowania tabeli na tabelę.

Narzędzie importu / eksportu jest zwykle lepsze niż zwykły SQL, gdy masz konwersje typów i możliwe obcięcie wartości w mapowaniu. Ogólnie rzecz biorąc, im bardziej złożone jest mapowanie, tym wydajniej używasz narzędzia ETL, takiego jak Integration Services (SSIS), zamiast bezpośredniego języka SQL.

Narzędzie importu / eksportu jest w rzeczywistości kreatorem SSIS i możesz zapisać swoją pracę jako pakiet dtsx.

mika
źródło
2

Myślę, że to stwierdzenie może zrobić, co chcesz.

INSERT INTO newTableName (SELECT column1, column2, column3 FROM oldTable);
Chris Ballance
źródło
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
źródło