Database
 sql >> Baza danych >  >> RDS >> Database

SQL INSERT INTO… SELECT Przykłady

SQL INSERT Instrukcja jest najczęściej używana do wstawiania pojedynczych wierszy do tabeli.

Ale możesz także wstawić wyniki zapytania do tabeli. Oznacza to, że możesz wstawić wiele wierszy naraz (o ile zostaną zwrócone przez zapytanie).

Przykład podstawowy

Oto podstawowy przykład do zademonstrowania.

INSERT INTO Pets2
SELECT * FROM Pets;

To wstawia wszystkie wiersze z Pets tabeli do Pets2 tabela.

Zakłada, że ​​stworzyliśmy już Pets2 tabeli i czy ma poprawną definicję.

Jeśli nie istnieje lub nie ma prawidłowej definicji, pojawi się błąd.

Wstaw dane z wielu tabel

Możesz użyć tej metody, aby wstawić dane z wielu tabel.

INSERT INTO PetsTypesOwners
SELECT 
    p.PetId,
    p.PetName,
    p.DOB,
    pt.PetTypeId,
    pt.PetType,    
    o.OwnerId,
    o.FirstName,
    o.LastName,
    o.Phone,
    o.Email
FROM Pets p 
INNER JOIN PetTypes pt 
ON p.PetTypeId = pt.PetTypeId 
INNER JOIN Owners o 
ON p.OwnerId = o.OwnerId;

W tym przykładzie wstawiłem dane z trzech tabel do jednej tabeli o nazwie PetsTypesOwners .

Zauważ, że wyraźnie wymieniłem każdą kolumnę. Zrobiłem to, ponieważ kolumna docelowa ma mniej kolumn niż trzy tabele razem wzięte. W tym przypadku dzieje się tak dlatego, że gdybym wybrał wszystkie kolumny, zapytanie zwróciłoby zduplikowane kolumny, ponieważ klucze obce mają taką samą nazwę i wartość jak ich klucze podstawowe.

Gdybym chciał uwzględnić te zduplikowane kolumny, kolumna docelowa musiałaby zawierać te zduplikowane kolumny, ale z inną nazwą dla jednej z każdej zduplikowanej pary.

Oto przykład zaznaczenia wszystkich kolumn (wybiorę je tutaj wyraźnie, abyś mógł zobaczyć ich nazwy):

INSERT INTO PetsTypesOwners2
SELECT 
    p.PetId, 
    p.OwnerId, 
    p.PetTypeId,
    p.PetName,
    p.DOB,
    pt.PetTypeId,
    pt.PetType,    
    o.OwnerId,
    o.FirstName,
    o.LastName,
    o.Phone,
    o.Email
FROM Pets p 
INNER JOIN PetTypes pt 
ON p.PetTypeId = pt.PetTypeId 
INNER JOIN Owners o 
ON p.OwnerId = o.OwnerId;

Widać, że istnieją dwie kolumny o nazwie OwnerId i dwa o nazwie PetTypeId , każdy z innej tabeli. Są to klucze podstawowe i klucze obce odpowiednich tabel.

Biorąc pod uwagę, że te kolumny są duplikatami, w poprzednim przykładzie uwzględniłem tylko jedną z nich. Ale na potrzeby tego demo umieściłem je w tym przykładzie.

Aby zaspokoić ten nowy INSERT INTO... SELECT oświadczenie, potrzebujemy, aby nasza tabela docelowa miała odpowiednią liczbę kolumn i zgodną definicję.

Dlatego definicja naszej tabeli docelowej może wyglądać mniej więcej tak:

CREATE TABLE PetsTypesOwners2 (
    PetId       int NOT NULL PRIMARY KEY,
    PetPetType  varchar(60) NOT NULL,
    PetOwnerId  int NOT NULL,
    PetName     varchar(60) NOT NULL,
    DOB         date NULL,
    PetTypeId   int NOT NULL,
    PetType     varchar(60) NOT NULL,
    OwnerId     int NOT NULL,
    FirstName   varchar(60) NOT NULL,
    LastName    varchar(60) NOT NULL,
    Phone       varchar(20) NOT NULL,
    Email       varchar(254)
);

W tym przypadku poprzedziłem jedną z każdej zduplikowanej kolumny przedrostkiem Pet . W szczególności utworzyłem PetPetTypeId (który mapuje do p.OwnerId w zapytaniu) i PetOwnerId kolumna (która mapuje do p.PetTypeId w zapytaniu).

Należy jednak pamiętać, że nie ma znaczenia, jak nazwiesz swoje kolumny w tabeli docelowej. INSERT INTO... SELECT oświadczenie to nie obchodzi. INSERT INTO... SELECT oświadczenie jest zainteresowane tylko kolejnością kolumn.

Wstaw dane z widoku

Możesz użyć tego samego INSERT INTO... SELECT składnia do wstawiania danych do tabeli z widoku.

Oto krótki przykład:

INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;

W tym przypadku vPetTypeCount jest widokiem i wstawiam jego zawartość do tabeli o nazwie PetTypeCount .

Wstaw dane z procedury przechowywanej

Niektóre DBMS (takie jak SQL Server) mogą również używać tego samego INSERT INTO... SELECT składnia do wstawiania danych do tabeli z procedury składowanej.

Oto krótki przykład:

INSERT INTO PetById
EXEC uspGetPetById 2;

Ponownie zakładamy, że mamy tabelę docelową z poprawną definicją.

SELECT INTO Oświadczenie

W zależności od DBMS, istnieje również SELECT INTO oświadczenie, którego możesz użyć do automatycznego utworzenia nowej tabeli na podstawie zestawu wyników, a następnie wstaw do niego ten zestaw wyników.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uniknąć wstawiania zduplikowanych rekordów w zapytaniu SQL INSERT (5 łatwych sposobów)

  2. Łączenie się z Sage z Javy

  3. Planowanie pojemności z wykorzystaniem danych dotyczących wydajności

  4. Zatrzask DBCC_OBJECT_METADATA

  5. Praca z danymi Java w Sisense