De SQL CREATE TABLE ... AS SELECT
statement stelt u in staat om de resultaten van een zoekopdracht in een nieuwe tabel in te voegen.
Basisvoorbeeld
Hier is een eenvoudig voorbeeld om het selecteren en invoegen van de gegevens in een nieuwe tabel te demonstreren.
CREATE TABLE Pets2 AS
(SELECT * FROM Pets);
Dit creëert een nieuwe tabel met de naam Pets2
(met dezelfde definitie als Pets
), en voegt de zoekresultaten erin in.
De SQL-standaard vereist haakjes rond de subquery-clausule, maar deze kunnen optioneel zijn in uw DBMS (bijvoorbeeld PostgreSQL).
Als we beide tabellen selecteren, kunnen we zien dat ze allebei dezelfde gegevens hebben.
barney=# SELECT * FROM Pets;
petid | pettypeid | ownerid | petname | dob
-------+-----------+---------+---------+------------
1 | 2 | 3 | Fluffy | 2020-11-20
2 | 3 | 3 | Fetch | 2019-08-16
3 | 2 | 2 | Scratch | 2018-10-01
4 | 3 | 3 | Wag | 2020-03-15
5 | 1 | 1 | Tweet | 2020-11-28
6 | 3 | 4 | Fluffy | 2020-09-17
7 | 3 | 2 | Bark |
8 | 2 | 4 | Meow |
(8 rows)
barney=# SELECT * FROM Pets2;
petid | pettypeid | ownerid | petname | dob
-------+-----------+---------+---------+------------
1 | 2 | 3 | Fluffy | 2020-11-20
2 | 3 | 3 | Fetch | 2019-08-16
3 | 2 | 2 | Scratch | 2018-10-01
4 | 3 | 3 | Wag | 2020-03-15
5 | 1 | 1 | Tweet | 2020-11-28
6 | 3 | 4 | Fluffy | 2020-09-17
7 | 3 | 2 | Bark |
8 | 2 | 4 | Meow |
(8 rows)
Als de tabel al bestaat
Als we proberen om de CREATE TABLE ... AS SELECT
statement opnieuw, krijgen we een foutmelding omdat de tabel al bestaat.
CREATE TABLE Pets2 AS
(SELECT * FROM Pets);
Resultaat:
relation "pets2" already exists
Als u gegevens wilt invoegen in een tabel die al bestaat, gebruikt u de INSERT INTO... SELECT
uitspraak. Hiermee worden de gegevens aan alle bestaande gegevens toegevoegd. Dat wil zeggen, het zal nieuwe rijen aan de tabel toevoegen, terwijl bestaande rijen behouden blijven.
De resultaten filteren
De SELECT
statement kan de gebruikelijke SELECT
statement dingen, zoals het filteren van de resultaten met een WHERE
clausule.
CREATE TABLE Pets3 AS
(SELECT * FROM Pets
WHERE DOB < '2020-06-01');
In dit voorbeeld filter ik de gegevens op alleen die huisdieren met een geboortedatum (DOB) van vóór 1 juni 2020.
Kiezen uit meerdere tabellen
U kunt gegevens uit meerdere tabellen selecteren en vervolgens de definitie van de bestemmingstabel laten baseren op de resultatenset.
CREATE TABLE PetsTypesOwners AS
(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);
Hier vragen we drie tabellen en voegen de resultaten in een tabel met de naam PetsTypesOwners
.
Merk op dat ik hier elke kolom heb vermeld omdat ik niet alle kolommen wilde opnemen.
In het bijzonder wilde ik de kolommen met de externe sleutel / primaire sleutel niet verdubbelen. In mijn geval delen de refererende sleutels dezelfde namen als hun primaire sleutel-tegenhangers in de bovenliggende tabel, en ik zou een foutmelding hebben gekregen omdat er dubbele kolomnamen in de bestemmingstabel werden gemaakt.
Dit is wat ik bedoel.
CREATE TABLE PetsTypesOwners2 AS
(SELECT *
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
INNER JOIN Owners o
ON p.OwnerId = o.OwnerId);
Resultaat:
column "pettypeid" specified more than once
Als je refererende sleutels andere kolomnamen gebruiken dan de primaire sleutels, dan zou je waarschijnlijk eindigen met een bestemmingstabel die onnodige kolommen bevat (een voor de primaire sleutel, een voor de refererende sleutel en elk met dezelfde waarden).
Als u dergelijke dubbele kolommen echt wilt opnemen, maar ze dezelfde naam hebben, kunt u altijd aliassen gebruiken om ze een andere naam te geven in de bestemmingstabel.
CREATE TABLE PetsTypesOwners2 AS
(SELECT
p.PetId,
p.OwnerId AS PetOwnerId,
p.PetTypeId AS PetPetTypeId,
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 geval heb ik kolomaliassen gebruikt om de naam van twee kolommen opnieuw toe te wijzen aan PetOwnerId
en PetPetTypeId
.
DBMS-ondersteuning
Hoewel de CREATE TABLE ... AS SELECT
statement voldoet aan de SQL-standaard, wordt het niet door alle DBMS'en ondersteund. Voor degenen die het wel ondersteunen, zijn er ook variaties rond de implementatie ervan.
Daarom raad ik aan om de documentatie van uw DBMS te raadplegen als u deze verklaring wilt gebruiken.
Als u SQL Server gebruikt, kunt u de SELECT INTO
. gebruiken verklaring, die in wezen hetzelfde doet.
Er is ook de INSERT INTO ... SELECT
verklaring dat veel DBMS's ondersteunen. Deze instructie voegt de queryresultaten in een bestaande tabel in.