Chciałbym Wam dzisiaj opisać działanie składni INSERT INTO SELECT. Jak już widzimy po słowach kluczowych coś wstawiamy (INSERT) i określamy skąd i co wrzucamy (SELECT). Żeby jakieś dane wziąć i gdzieś dodać musimy określić dwie rzeczy źródło i zakres danych do pobrania oraz cel, czyli gdzie te pobrane dane chcemy "wrzucić". To gdzie chcemy "wrzucić" określamy po słówkach INSERT INTO, a to co i skąd chcemy pobrać określamy po słówku SELECT, tutaj będziemy konstruowali po prostu zapytanie. Składnia całej konstrukcji poniżej. PAMIĘTAJ, że struktura danych kopiowanych i struktura danych do której te dane kopiujemy muszą być zgodne.
Składnia SQL INSERT INTO SELECT
INSERT INTO tabela_cel(nazwy_kolumn_po_przecinkach)
SELECT nazwy_kolumn_po_przecinkach FROM tabela_źródło
— opcjonalnie możemy dodać "sekcję" WHERE
Przykład zastosowania INSERT INTO SELECT (baza: Northwind)
Do przykładu wykorzystamy treningową bazę Northwind. Dodamy do niej nową tabelę "Customers_tmp" z kolumnami (CustomersID, CompanyName, City). Zrzut z tworzenia tabeli poniżej.
Teraz "skopiujemy" rekord o CustomersID = 'ALFKI' z tabeli Customers (ale tylko dane z kolumn: CustomersID, CompanyName, City) do tabeli "Customers_tmp" z takimi samymi kolumnami. Zapytanie poniżej.
INSERT INTO Customers_tmp
SELECT CustomerID, CompanyName, City FROM Customers WHERE CustomerID = 'ALFKI'
czyli do tabeli "Customers_tmp" wrzucimy dane z rekordu o CustomersID = 'ALFKI z tabeli "Customers", ale tylko dane z kolumn: CustomerID, CompanyName, City.
Uruchamiamy zapytanie i o poprawności wykonania zapytania mówi nam komunikat poniżej.
teraz żeby sprawdzić czy wszystko zadziałało musimy odpytać tabelę "Customers_tmp" o wszystkie rekordy.
SELECT
*
FROM
Customers_tmp
wynik zapytania poniżej
Na zrzucie widzimy, że w tabeli "Customers_tmp" znajdują się nowe dane, co potwiedza poprawność działania naszego zapytani.
Przykład zastosowania INSERT INTO SELECT (baza: Adventureworks)
W poprzednim przykładzie kopiowaliśmy tylko jeden rekord. Teraz spóbujmy skopiować więcej rekordow i do tego celu wykorzystam bazę AdventureWorks2008R2.
Tworzymy nową tabelę o nazwie "Person_SP" (skrót SP od Sales Person) do której będziemy kopiowali osoby z tabeli "Person.Person" ale tylko takie którę są sprzedawcami. Zakres kopiowanych danych to: BusinessEntityID, FirstName, LastName.
Tworzymy nową tabelę "Person_SP"
Teraz tworzymy strukturę z INSERT INTO SELECT gdzie w części SELECT zbudujemy zapytanie które pobierze nam dane (BusinessEntityID, FirstName, LastName) o osobach które sa sprzedawcami.
INSERT INTO Person_SP
SELECT BusinessEntityID, FirstName, LastName FROM Person.Person WHERE PersonType = 'SP'
W tabeli "Person.Person" takich osób jest 17 więc dane tylu osób powinny być skopiowane do tabeli "Person_SP"
Uruchamiamy zapytanie (F5).
Powinniśmy otrzymać komunikat o poprawnym wykonaniu naszej konstrukcji.
Teraz żeby sprawdzić czy w tabeli "Person_SP" jest 17 rekordów z danymi budujemy zapytanie.
SELECT
*
FROM
Person_SP
Wynikiem zapytanie powinno wyć wygenerowanie 17-tu rekordow, co widzimy na zrzucie poniżej.