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.