SQL INSERT INTO SELECT

SQL INSERT INTO  SELECT



DEFINICJA

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.


SQL INSERT INTO SELECT składnia

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.

Nasze zadanie będzie polegało na „skopiowaniu” rekordu 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

W wyniku powinniśmy otrzymać jeden rekord


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.