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.