Die SQL SELECT INTO
statement ist eine Sybase-Erweiterung, die verwendet werden kann, um die Ergebnisse einer Abfrage in eine Tabelle (oder eine Variable, je nach DBMS) einzufügen.
In DBMS wie SQL Server und PostgreSQL ist die Datei SELECT INTO
-Anweisung erstellt eine neue Tabelle und fügt die Ergebniszeilen aus der Abfrage darin ein.
In MariaDB fügt es die Ergebnismenge in eine Variable ein. In Oracle weist es die ausgewählten Werte Variablen oder Sammlungen zu.
MySQL und SQLite unterstützen den SELECT INTO
nicht Aussage überhaupt.
Die Beispiele in diesem Artikel fügen die Resultsets in eine Tabelle ein. In MariaDB und Oracle kann die Zieltabelle durch einen Variablennamen (oder den Sammlungsnamen, wenn Sie Oracle verwenden) ersetzt werden.
Einfaches Beispiel
Hier ist ein einfaches Beispiel, um das Auswählen und Einfügen der Daten in eine neue Tabelle zu demonstrieren.
SELECT * INTO Pets2
FROM Pets;
Dieses Beispiel erstellt eine Tabelle namens Pets2
mit derselben Definition der Tabelle namens Pets
und fügt alle Daten von Pets
ein in Pets2
.
Wir können dies überprüfen, indem wir den Inhalt beider Tabellen auswählen.
SELECT * FROM Pets;
SELECT * FROM Pets2;
Ergebnis:
+---------+-------------+-----------+-----------+------------+ | 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 | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected) +---------+-------------+-----------+-----------+------------+ | 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 | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected)
Wenn die Tabelle bereits existiert
Wenn wir versuchen, SELECT INTO
auszuführen -Anweisung erneut, erhalten wir einen Fehler, da die Tabelle bereits vorhanden ist.
SELECT * INTO Pets2
FROM Pets;
Ergebnis:
Msg 2714, Level 16, State 6, Line 1 There is already an object named 'Pets2' in the database.
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.
SELECT * INTO Pets3
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.
SELECT
p.PetId,
p.PetName,
p.DOB,
pt.PetTypeId,
pt.PetType,
o.OwnerId,
o.FirstName,
o.LastName,
o.Phone,
o.Email
INTO PetsTypesOwners
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.
SELECT *
INTO PetsTypesOwners2
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
INNER JOIN Owners o
ON p.OwnerId = o.OwnerId;
Ergebnis:
Msg 2705, Level 16, State 3, Line 1 Column names in each table must be unique. Column name 'PetTypeId' in table 'PetsTypesOwners2' is 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.
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
INTO PetsTypesOwners3
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
.
Aus einer Ansicht auswählen
Sie können bei Bedarf auch Daten aus einer Ansicht auswählen.
SELECT * INTO PetTypeCount
FROM vPetTypeCount;
Dies wählt Daten aus dem vPetTypeCount
aus view und fügt sie in eine neue Tabelle namens PetTypeCount
ein .
Wir können dies mit einem SELECT
überprüfen Erklärung.
SELECT * FROM vPetTypeCount;
SELECT * FROM PetTypeCount;
Ergebnis:
+-----------+---------+ | PetType | Count | |-----------+---------| | Bird | 1 | | Cat | 3 | | Dog | 4 | +-----------+---------+ (3 rows affected) +-----------+---------+ | PetType | Count | |-----------+---------| | Bird | 1 | | Cat | 3 | | Dog | 4 | +-----------+---------+ (3 rows affected)
DBMS-Unterstützung
Wie bereits erwähnt, die SELECT INTO
-Anweisung ist eine Sybase-Erweiterung und wird nicht von allen großen DBMSs unterstützt. MySQL und SQLite unterstützen dies beispielsweise nicht.
Auch von den DBMS, die es unterstützen, variiert die tatsächliche Implementierung etwas zwischen den DBMS. Die obigen Beispiele wurden in SQL Server erstellt. In MariaDB und Oracle können Sie die Zieltabelle durch einen Variablennamen (oder Sammlungsnamen in Oracle) ersetzen.
Wenn Ihr DBMS den SELECT INTO
nicht unterstützt -Anweisung unterstützt es wahrscheinlich INSERT INTO... SELECT
Anweisung, also sollten Sie stattdessen diese versuchen.