Die SQL CREATE TABLE ... AS SELECT
-Anweisung können Sie die Ergebnisse einer Abfrage in eine neue Tabelle einfügen.
Einfaches Beispiel
Hier ist ein einfaches Beispiel, um das Auswählen und Einfügen der Daten in eine neue Tabelle zu demonstrieren.
CREATE TABLE Pets2 AS
(SELECT * FROM Pets);
Dadurch wird eine neue Tabelle mit dem Namen Pets2
erstellt (mit derselben Definition wie Pets
) und fügt die Abfrageergebnisse darin ein.
Der SQL-Standard erfordert Klammern um die Unterabfrageklausel, aber sie können in Ihrem DBMS (z. B. PostgreSQL) optional sein.
Wenn wir beide Tabellen auswählen, sehen wir, dass beide die gleichen Daten enthalten.
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)
Wenn die Tabelle bereits existiert
Wenn wir versuchen, CREATE TABLE ... AS SELECT
auszuführen -Anweisung erneut, erhalten wir einen Fehler, da die Tabelle bereits vorhanden ist.
CREATE TABLE Pets2 AS
(SELECT * FROM Pets);
Ergebnis:
relation "pets2" already exists
Wenn Sie Daten in eine bereits vorhandene Tabelle einfügen möchten, verwenden Sie den INSERT INTO... SELECT
Erklärung. Dadurch werden die Daten an alle vorhandenen Daten angehängt. Das heißt, es werden der Tabelle neue Zeilen hinzugefügt, während alle vorhandenen Zeilen beibehalten werden.
Filtern der Ergebnisse
Die SELECT
-Anweisung kann das übliche SELECT
ausführen Anweisungskram, wie das Filtern der Ergebnisse mit einem WHERE
Klausel.
CREATE TABLE Pets3 AS
(SELECT * FROM Pets
WHERE DOB < '2020-06-01');
In diesem Beispiel filtere ich die Daten nur nach Haustieren, deren Geburtsdatum (DOB) vor dem 1. Juni 2020 liegt.
Auswahl aus mehreren Tabellen
Sie können Daten aus mehreren Tabellen auswählen und dann die Definition der Zieltabelle auf der Ergebnismenge basieren lassen.
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 fragen wir drei Tabellen ab und fügen die Ergebnisse in eine Tabelle namens PetsTypesOwners
ein .
Beachten Sie, dass ich hier jede Spalte aufgelistet habe, weil ich nicht alle Spalten einbeziehen wollte.
Insbesondere wollte ich die Fremdschlüssel-/Primärschlüsselspalten nicht verdoppeln. In meinem Fall haben die Fremdschlüssel dieselben Namen wie ihre Primärschlüssel-Pendants in der übergeordneten Tabelle, und ich hätte einen Fehler erhalten, weil in der Zieltabelle doppelte Spaltennamen erstellt wurden.
Hier ist, was ich meine.
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);
Ergebnis:
column "pettypeid" specified more than once
Wenn Ihre Fremdschlüssel andere Spaltennamen als die Primärschlüssel verwenden, erhalten Sie wahrscheinlich eine Zieltabelle, die unnötige Spalten enthält (eine für den Primärschlüssel, eine für den Fremdschlüssel und jede mit denselben Werten). /P>
Wenn Sie wirklich solche doppelten Spalten einschließen möchten, aber sie den gleichen Namen haben, können Sie ihnen immer Aliase mit einem anderen Namen in der Zieltabelle zuweisen.
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 diesem Fall habe ich Spaltenaliase verwendet, um den Namen von zwei Spalten PetOwnerId
neu zuzuweisen und PetPetTypeId
.
DBMS-Unterstützung
Obwohl die CREATE TABLE ... AS SELECT
-Anweisung entspricht dem SQL-Standard, sie wird nicht von allen DBMSs unterstützt. Auch für diejenigen, die es unterstützen, gibt es Variationen in Bezug auf seine Implementierung.
Daher würde ich vorschlagen, in der Dokumentation Ihres DBMS nachzusehen, ob Sie diese Anweisung verwenden möchten.
Wenn Sie SQL Server verwenden, können Sie den SELECT INTO
verwenden -Anweisung, die im Grunde dasselbe tut.
Es gibt auch den INSERT INTO ... SELECT
Aussage, die viele DBMSs unterstützen. Diese Anweisung fügt die Abfrageergebnisse in eine vorhandene Tabelle ein.