sql >> Databáze >  >> RDS >> Database

SQL CREATE TABLE … AS Příkaz SELECT

SQL CREATE TABLE ... AS SELECT umožňuje vložit výsledky dotazu do nové tabulky.

Základní příklad

Zde je základní příklad, který demonstruje výběr a vkládání dat do nové tabulky.

CREATE TABLE Pets2 AS
(SELECT * FROM Pets);

Tím se vytvoří nová tabulka s názvem Pets2 (se stejnou definicí jako Pets ) a vloží do něj výsledky dotazu.

Standard SQL vyžaduje závorky kolem klauzule subquery, ale mohou být volitelné ve vašem DBMS (například PostgreSQL).

Pokud vybereme obě tabulky, uvidíme, že obě mají stejná 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)

Když tabulka již existuje

Pokud se pokusíme spustit CREATE TABLE ... AS SELECT znovu, dostaneme chybu, protože tabulka již existuje.

CREATE TABLE Pets2 AS
(SELECT * FROM Pets);

Výsledek:

relation "pets2" already exists

Pokud chcete vložit data do tabulky, která již existuje, použijte INSERT INTO... SELECT prohlášení. Tím se data připojí ke všem existujícím datům. To znamená, že do tabulky přidá nové řádky, přičemž všechny existující řádky zachová.

Filtrování výsledků

SELECT příkaz může provést obvyklý SELECT příkazy, jako je filtrování výsledků pomocí WHERE doložka.

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

V tomto příkladu filtruji data pouze na ta domácí zvířata, která mají datum narození (DOB) před 1. červnem 2020.

Výběr z více tabulek

Můžete vybrat data z více tabulek a poté nechat, aby byla definice cílové tabulky založena na výsledné sadě.

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

Zde dotazujeme tři tabulky a výsledky vložíme do tabulky nazvané PetsTypesOwners .

Všimněte si, že jsem zde uvedl každý sloupec, protože jsem nechtěl zahrnout všechny sloupce.

Konkrétně jsem nechtěl zdvojnásobit sloupce cizí klíč / primární klíč. V mém případě sdílejí cizí klíče stejná jména jako jejich protějšky primárního klíče v nadřazené tabulce a já bych obdržel chybu kvůli vytváření duplicitních názvů sloupců v cílové tabulce.

Tady je to, co mám na mysli.

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

Výsledek:

column "pettypeid" specified more than once

Pokud vaše cizí klíče používají jiné názvy sloupců než primární klíče, pravděpodobně skončíte s cílovou tabulkou, která obsahuje zbytečné sloupce (jeden pro primární klíč, jeden pro cizí klíč a každý obsahuje stejné hodnoty).

Pokud opravdu chcete zahrnout takové duplicitní sloupce, ale mají stejný název, můžete jim vždy pomocí aliasů přiřadit v cílové tabulce jiný název.

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

V tomto případě jsem použil aliasy sloupců k přeřazení názvu dvou sloupců na PetOwnerId a PetPetTypeId .

Podpora DBMS

Ačkoli CREATE TABLE ... AS SELECT příkaz odpovídá standardu SQL, není podporován všemi DBMS. Také pro ty, kteří jej podporují, existují různé varianty jeho implementace.

Pokud tedy chcete toto prohlášení použít, doporučuji vám zkontrolovat dokumentaci vašeho DBMS.

Pokud používáte SQL Server, můžete použít SELECT INTO prohlášení, které dělá v podstatě totéž.

K dispozici je také INSERT INTO ... SELECT prohlášení, které podporuje mnoho DBMS. Tento příkaz vloží výsledky dotazu do existující tabulky.


  1. Jak zapsat znaky UTF-8 pomocí hromadného vkládání na SQL Server?

  2. Materialized Views – Identifikace poslední aktualizace

  3. Jak získat aktuální datum a čas v MySQL

  4. Odstraňte duplicitní řádky na serveru SQL Server