sql >> Databasteknik >  >> RDS >> Database

SQL CREATE TABLE … SOM SELECT-sats

SQL-koden CREATE TABLE ... AS SELECT satsen gör att du kan infoga resultaten av en fråga i en ny tabell.

Grundläggande exempel

Här är ett grundläggande exempel för att visa hur du väljer och infogar data i en ny tabell.

CREATE TABLE Pets2 AS
(SELECT * FROM Pets);

Detta skapar en ny tabell som heter Pets2 (med samma definition som Husdjur ), och infogar frågeresultaten i den.

SQL-standarden kräver parenteser runt subquery-satsen, men de kan vara valfria i ditt DBMS (till exempel PostgreSQL).

Om vi ​​väljer båda tabellerna kan vi se att de båda har samma data.

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)

När tabellen redan finns

Om vi ​​försöker köra CREATE TABLE ... AS SELECT uttalande igen, får vi ett fel, på grund av att tabellen redan finns.

CREATE TABLE Pets2 AS
(SELECT * FROM Pets);

Resultat:

relation "pets2" already exists

Om du vill infoga data i en tabell som redan finns, använd INSERT INTO... SELECT påstående. Detta kommer att lägga till data till alla befintliga data. Det vill säga, det kommer att lägga till nya rader i tabellen, samtidigt som alla befintliga rader behålls.

Filtrera resultaten

SELECT uttalande kan göra den vanliga SELECT satser, som att filtrera resultaten med en WHERE klausul.

CREATE TABLE Pets3 AS
(SELECT * FROM Pets
WHERE DOB < '2020-06-01');

I det här exemplet filtrerar jag data till bara de husdjur som har ett födelsedatum (DOB) från före den 1 juni 2020.

Välja från flera tabeller

Du kan välja data från flera tabeller och sedan låta destinationstabellens definition baseras på resultatuppsättningen.

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

Här frågar vi tre tabeller och infogar resultaten i en tabell som heter PetsTypesOwners .

Observera att jag listade varje kolumn här eftersom jag inte ville inkludera alla kolumner.

Specifikt ville jag inte dubbla upp kolumnerna för främmande nyckel/primärnyckel. I mitt fall delar de främmande nycklarna samma namn som deras motsvarigheter för primärnyckeln i den överordnade tabellen, och jag skulle ha fått ett felmeddelande på grund av att dubbla kolumnnamn skapades i destinationstabellen.

Det här är vad jag menar.

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

Resultat:

column "pettypeid" specified more than once

Om dina främmande nycklar använder olika kolumnnamn än de primära nycklarna, skulle du förmodligen sluta med en destinationstabell som innehåller onödiga kolumner (en för primärnyckeln, en för den främmande nyckeln och var och en innehåller samma värden).

Om du verkligen vill inkludera sådana dubbletter av kolumner, men de delar samma namn, kan du alltid använda alias för att tilldela dem ett annat namn i destinationstabellen.

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

I det här fallet använde jag kolumnalias för att tilldela namnet på två kolumner till PetOwnerId och PetPetTypeId .

DBMS-stöd

Även om CREATE TABLE ... AS SELECT satsen överensstämmer med SQL-standarden, den stöds inte av alla DBMS. Dessutom, för dem som stöder det, finns det variationer kring dess implementering.

Därför föreslår jag att du kontrollerar din DBMS-dokumentation om du vill använda detta uttalande.

Om du använder SQL Server kan du använda SELECT INTO statement, som i princip gör samma sak.

Det finns också INSERT INTO ... SELECT uttalande som många DBMS stödjer. Denna sats infogar frågeresultaten i en befintlig tabell.


  1. Oracle Dynamic Pivoting

  2. Hur man kör Opatch i icke interaktiv form

  3. Hur kör jag en MS SQL Server lagrad procedur i java/jsp och returnerar tabelldata?

  4. MySQL -- Går ihop mellan databaser på olika servrar med Python?