sql >> Database >  >> RDS >> Database

SQL INSERT INTO… SELECT Voorbeelden

De SQL INSERT statement wordt meestal gebruikt om individuele rijen in een tabel in te voegen.

Maar u kunt de resultaten van een query ook in een tabel invoegen. Dit betekent dat u meerdere rijen tegelijk kunt invoegen (zolang ze worden geretourneerd door de zoekopdracht).

Basisvoorbeeld

Hier is een eenvoudig voorbeeld om te demonstreren.

INSERT INTO Pets2
SELECT * FROM Pets;

Dat voegt alle rijen in van de Pets tabel in Pets2 tafel.

Het gaat ervan uit dat we de Pets2 . al hebben gemaakt tabel en dat deze de juiste definitie heeft.

Als het niet bestaat of niet de juiste definitie heeft, krijg je een foutmelding.

Gegevens uit meerdere tabellen invoegen

U kunt deze methode gebruiken om gegevens uit meerdere tabellen in te voegen.

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;

In dit voorbeeld heb ik gegevens uit drie tabellen ingevoegd in één tabel met de naam PetsTypesOwners .

Merk op dat ik elke kolom expliciet heb vermeld. Ik deed dit omdat de bestemmingskolom minder kolommen heeft dan de drie tabellen samen. In dit geval is dat omdat, als ik alle kolommen had geselecteerd, de query dubbele kolommen zou hebben geretourneerd omdat externe sleutels dezelfde naam en waarde hebben als hun primaire sleutels.

Als ik die dubbele kolommen wilde opnemen, zou de bestemmingskolom die dubbele kolommen moeten bevatten, maar met een andere naam voor een van elk dubbel paar.

Hier is een voorbeeld van het selecteren van alle kolommen (ik zal ze hier expliciet selecteren, zodat je hun namen kunt zien):

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;

U kunt zien dat er twee kolommen zijn met de naam OwnerId en twee genaamd PetTypeId , elk van een andere tafel. Dit zijn de primaire sleutels en externe sleutels van hun respectievelijke tabellen.

Aangezien die kolommen duplicaten zijn, heb ik in het vorige voorbeeld slechts één van elk opgenomen. Maar voor het doel van deze demo heb ik ze in dit voorbeeld opgenomen.

Dus om tegemoet te komen aan deze nieuwe INSERT INTO... SELECT statement, hebben we onze bestemmingstabel nodig om het juiste aantal kolommen te hebben en met een compatibele definitie.

Daarom kan de definitie van onze bestemmingstabel er ongeveer zo uitzien:

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

In dit geval heb ik een van elke dubbele kolom voorafgegaan door Pet . In het bijzonder heb ik een PetPetTypeId . gemaakt (die verwijst naar de p.OwnerId kolom in de zoekopdracht) en PetOwnerId kolom (die verwijst naar de p.PetTypeId kolom in de zoekopdracht).

Het is echter belangrijk op te merken dat het niet uitmaakt hoe u uw kolommen in de bestemmingstabel noemt. De INSERT INTO... SELECT verklaring gaat daar niet over. De INSERT INTO... SELECT statement is alleen geïnteresseerd in de kolomvolgorde.

Gegevens uit een weergave invoegen

U kunt dezelfde INSERT INTO... SELECT . gebruiken syntaxis om gegevens vanuit een weergave in een tabel in te voegen.

Hier is een snel voorbeeld:

INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;

In dit geval vPetTypeCount is een weergave en ik voeg de inhoud ervan in een tabel met de naam PetTypeCount .

Gegevens uit een opgeslagen procedure invoegen

Sommige DBMS'en (zoals SQL Server) kunnen ook dezelfde INSERT INTO... SELECT gebruiken syntaxis om gegevens in een tabel in te voegen vanuit een opgeslagen procedure.

Hier is een snel voorbeeld:

INSERT INTO PetById
EXEC uspGetPetById 2;

Nogmaals, dit veronderstelt dat we een bestemmingstabel hebben met de juiste definitie.

De SELECT INTO Verklaring

Afhankelijk van uw DBMS is er ook een SELECT INTO statement, dat u kunt gebruiken om automatisch een nieuwe tabel te maken op basis van de resultatenset, en vervolgens die resultaatset erin in te voegen.


  1. Neo4j - Laat een beperking vallen met Cypher

  2. Hoe MariaDB in te stellen om verticale uitvoer te gebruiken

  3. SQLite GLOB

  4. Magicbricks migreert naar MariaDB om het grote verkeer te ondersteunen