sql >> Database >  >> RDS >> Database

SQL CREATE TABLE … AS SELECT-instructie

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.


  1. Overdenkingen over SQL Server-beveiliging

  2. SQLException:tekenreeks of binaire gegevens worden afgekapt

  3. Combineer twee tabellen die geen gemeenschappelijke velden hebben

  4. Een MariaDB-cluster implementeren voor hoge beschikbaarheid