L'SQL CREATE TABLE ... AS SELECT
consente di inserire i risultati di una query in una nuova tabella.
Esempio di base
Ecco un esempio di base per dimostrare la selezione e l'inserimento dei dati in una nuova tabella.
CREATE TABLE Pets2 AS
(SELECT * FROM Pets);
Questo crea una nuova tabella chiamata Pets2
(con la stessa definizione di Pets
) e vi inserisce i risultati della query.
Lo standard SQL richiede parentesi intorno alla clausola di subquery, ma potrebbero essere facoltative nel tuo DBMS (ad esempio PostgreSQL).
Se selezioniamo entrambe le tabelle, possiamo vedere che entrambe hanno gli stessi dati.
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)
Quando la tabella esiste già
Se proviamo a eseguire il CREATE TABLE ... AS SELECT
di nuovo, otteniamo un errore, dovuto alla tabella già esistente.
CREATE TABLE Pets2 AS
(SELECT * FROM Pets);
Risultato:
relation "pets2" already exists
Se vuoi inserire dati in una tabella già esistente, usa INSERT INTO... SELECT
dichiarazione. Questo aggiungerà i dati a tutti i dati esistenti. Cioè, aggiungerà nuove righe alla tabella, mantenendo le righe esistenti.
Filtraggio dei risultati
Il SELECT
l'istruzione può fare il solito SELECT
materiale di istruzione, come filtrare i risultati con un WHERE
clausola.
CREATE TABLE Pets3 AS
(SELECT * FROM Pets
WHERE DOB < '2020-06-01');
In questo esempio, filtro i dati solo per quegli animali domestici che hanno una data di nascita (DOB) precedente al 1 giugno 2020.
Selezione da più tabelle
Puoi selezionare i dati da più tabelle, quindi fare in modo che la definizione della tabella di destinazione sia basata sul set di risultati.
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);
Qui, interroghiamo tre tabelle e inseriamo i risultati in una tabella chiamata PetsTypesOwners
.
Nota che ho elencato ogni colonna qui perché non volevo includere tutte le colonne.
In particolare, non volevo raddoppiare le colonne chiave esterna/chiave primaria. Nel mio caso, le chiavi esterne condividono gli stessi nomi delle loro controparti di chiave primaria nella tabella padre e avrei ricevuto un errore a causa della creazione di nomi di colonna duplicati nella tabella di destinazione.
Ecco cosa intendo.
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);
Risultato:
column "pettypeid" specified more than once
Se le tue chiavi esterne utilizzano nomi di colonna diversi rispetto alle chiavi primarie, probabilmente ti ritroverai con una tabella di destinazione che contiene colonne non necessarie (una per la chiave primaria, una per la chiave esterna e ciascuna contenente gli stessi valori).
Se vuoi davvero includere tali colonne duplicate, ma condividono lo stesso nome, puoi sempre utilizzare gli alias per assegnarle con un nome diverso nella tabella di destinazione.
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 questo caso ho utilizzato gli alias di colonna per riassegnare il nome di due colonne a PetOwnerId
e PetPetTypeId
.
Supporto DBMS
Sebbene il CREATE TABLE ... AS SELECT
è conforme allo standard SQL, non è supportato da tutti i DBMS. Inoltre, per coloro che lo supportano, ci sono variazioni sulla sua implementazione.
Pertanto, ti suggerisco di controllare la documentazione del tuo DBMS se desideri utilizzare questa affermazione.
Se utilizzi SQL Server, puoi utilizzare SELECT INTO
dichiarazione, che fa sostanzialmente la stessa cosa.
C'è anche il INSERT INTO ... SELECT
istruzione supportata da molti DBMS. Questa istruzione inserisce i risultati della query in una tabella esistente.