sql >> Databáze >  >> RDS >> Database

SQL INSERT INTO… SELECT Příklady

SQL INSERT příkaz se nejčastěji používá k vkládání jednotlivých řádků do tabulky.

Výsledky dotazu ale můžete také vložit do tabulky. To znamená, že můžete vložit více řádků najednou (pokud jsou vráceny dotazem).

Základní příklad

Zde je základní příklad k demonstraci.

INSERT INTO Pets2
SELECT * FROM Pets;

Tím se vloží všechny řádky z Pets tabulky do Pets2 tabulka.

Předpokládá se, že jsme již vytvořili Pets2 a že má správnou definici.

Pokud neexistuje nebo nemá správnou definici, zobrazí se chyba.

Vložit data z více tabulek

Tuto metodu můžete použít k vložení dat z více tabulek.

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;

V tomto příkladu jsem vložil data ze tří tabulek do jedné tabulky s názvem PetsTypesOwners .

Všimněte si, že jsem výslovně uvedl každý sloupec. Udělal jsem to, protože cílový sloupec má méně sloupců než tři tabulky dohromady. V tomto případě je to proto, že kdybych vybral všechny sloupce, dotaz by vrátil duplicitní sloupce kvůli cizím klíčům, které mají stejný název a hodnotu jako jejich primární klíče.

Pokud bych chtěl zahrnout tyto duplicitní sloupce, cílový sloupec by musel obsahovat tyto duplicitní sloupce, ale s jiným názvem pro jeden z každého duplicitního páru.

Zde je příklad výběru všech sloupců (zde je vyberu explicitně, abyste viděli jejich názvy):

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;

Můžete vidět, že existují dva sloupce nazvané OwnerId a dva s názvem PetTypeId , každý z jiné tabulky. Toto jsou primární klíče a cizí klíče příslušných tabulek.

Vzhledem k tomu, že tyto sloupce jsou duplicitní, zahrnul jsem do předchozího příkladu pouze jeden z každého z nich. Ale pro účely této ukázky jsem je zahrnul do tohoto příkladu.

Abychom vyhověli tomuto novému INSERT INTO... SELECT potřebujeme, aby naše cílová tabulka měla správný počet sloupců a kompatibilní definici.

Proto může definice naší cílové tabulky vypadat nějak takto:

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)
);

V tomto případě jsem před jeden z každého duplicitního sloupce přidal předponu Pet . Konkrétně jsem vytvořil PetPetTypeId (který se mapuje na p.OwnerId sloupec v dotazu) a PetOwnerId sloupec (který mapuje na p.PetTypeId sloupec v dotazu).

Je však důležité poznamenat, že nezáleží na tom, jak nazýváte své sloupce v cílové tabulce. INSERT INTO... SELECT prohlášení se o to nestará. INSERT INTO... SELECT výpis se zajímá pouze o pořadí sloupců.

Vložit data z pohledu

Můžete použít stejný INSERT INTO... SELECT syntaxe pro vložení dat do tabulky z pohledu.

Zde je rychlý příklad:

INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;

V tomto případě vPetTypeCount je pohled a jeho obsah vkládám do tabulky s názvem PetTypeCount .

Vložit data z uložené procedury

Některé DBMS (jako je SQL Server) mohou také používat stejné INSERT INTO... SELECT syntaxe pro vložení dat do tabulky z uložené procedury.

Zde je rychlý příklad:

INSERT INTO PetById
EXEC uspGetPetById 2;

Opět to předpokládá, že máme cílovou tabulku se správnou definicí.

SELECT INTO Prohlášení

V závislosti na vašem DBMS existuje také SELECT INTO příkaz, který můžete použít k automatickému vytvoření nové tabulky na základě sady výsledků a poté do ní tuto sadu výsledků vložit.


  1. PostgreSql:Json Array k řádkům pomocí laterálního spojení

  2. Vyplňte chybějící data pro výstup dotazu SQL Server pomocí CTE

  3. Provozní zprávy pro MySQL, MariaDB, PostgreSQL a MongoDB

  4. Zřetězit výsledky z dotazu SQL v Oracle