Database
 sql >> Datenbank >  >> RDS >> Database

SQL SELECT INTO-Anweisung

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.