sql >> Database >  >> RDS >> Database

SQL SELECT INTO-instructie

De SQL SELECT INTO statement is een Sybase-extensie die kan worden gebruikt om de resultaten van een query in een tabel (of een variabele, afhankelijk van het DBMS) in te voegen.

In DBMS'en zoals SQL Server en PostgreSQL, is de SELECT INTO statement maakt een nieuwe tabel aan en voegt de resulterende rijen van de query erin in.

In MariaDB voegt het de resultaatset in een variabele in. In Oracle wijst het de geselecteerde waarden toe aan variabelen of verzamelingen.

MySQL en SQLite ondersteunen niet de SELECT INTO verklaring helemaal niet.

De voorbeelden in dit artikel voegen de resultaatsets in een tabel in. In MariaDB en Oracle kan de bestemmingstabel worden vervangen door een variabelenaam (of de collectienaam als u Oracle gebruikt).

Basisvoorbeeld

Hier is een eenvoudig voorbeeld om het selecteren en invoegen van de gegevens in een nieuwe tabel te demonstreren.

SELECT * INTO Pets2
FROM Pets;

In dit voorbeeld wordt een tabel gemaakt met de naam Pets2 met dezelfde definitie van de tabel genaamd Pets en voegt alle gegevens in van Pets in Pets2 .

We kunnen dit verifiëren door de inhoud van beide tabellen te selecteren.

SELECT * FROM Pets;
SELECT * FROM Pets2;

Resultaat:

+---------+-------------+-----------+-----------+------------+
| 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)

Als de tabel al bestaat

Als we proberen de SELECT INTO . uit te voeren statement opnieuw, krijgen we een foutmelding omdat de tabel al bestaat.

SELECT * INTO Pets2
FROM Pets;

Resultaat:

Msg 2714, Level 16, State 6, Line 1
There is already an object named 'Pets2' in the database.

Als u gegevens wilt invoegen in een reeds bestaande tabel, gebruikt u de INSERT INTO... SELECT uitspraak. Hiermee worden de gegevens aan alle bestaande gegevens toegevoegd. Dat wil zeggen, het zal nieuwe rijen aan de tabel toevoegen, terwijl bestaande rijen behouden blijven

De resultaten filteren

De SELECT statement kan de gebruikelijke SELECT statement dingen, zoals het filteren van de resultaten met een WHERE clausule.

SELECT * INTO Pets3
FROM Pets
WHERE DOB < '2020-06-01';

In dit voorbeeld filter ik de gegevens op alleen die huisdieren met een geboortedatum (DOB) van vóór 1 juni 2020.

Kiezen uit meerdere tabellen

U kunt gegevens uit meerdere tabellen selecteren en vervolgens de definitie van de bestemmingstabel laten baseren op de resultatenset.

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 vragen we drie tabellen en voegen de resultaten in een tabel met de naam PetsTypesOwners .

Merk op dat ik hier elke kolom heb vermeld omdat ik niet alle kolommen wilde opnemen.

In het bijzonder wilde ik de kolommen met de externe sleutel / primaire sleutel niet verdubbelen. In mijn geval delen de refererende sleutels dezelfde namen als hun primaire sleutel-tegenhangers in de bovenliggende tabel, en ik zou een foutmelding hebben gekregen omdat er dubbele kolomnamen in de bestemmingstabel werden gemaakt.

Dit is wat ik bedoel.

SELECT *
INTO PetsTypesOwners2
FROM Pets p 
INNER JOIN PetTypes pt 
ON p.PetTypeId = pt.PetTypeId 
INNER JOIN Owners o 
ON p.OwnerId = o.OwnerId;

Resultaat:

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.

Als je refererende sleutels andere kolomnamen gebruiken dan de primaire sleutels, dan zou je waarschijnlijk eindigen met een bestemmingstabel die onnodige kolommen bevat (een voor de primaire sleutel, een voor de refererende sleutel en elk met dezelfde waarden).

Als u dergelijke dubbele kolommen echt wilt opnemen, maar ze dezelfde naam hebben, kunt u altijd aliassen gebruiken om ze een andere naam te geven in de bestemmingstabel.

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 dit geval heb ik kolomaliassen gebruikt om de naam van twee kolommen opnieuw toe te wijzen aan PetOwnerId en PetPetTypeId .

SELECTEER IN Van een weergave

U kunt desgewenst ook gegevens uit een weergave selecteren.

SELECT * INTO PetTypeCount
FROM vPetTypeCount;

Dit selecteert gegevens uit de vPetTypeCount bekijken en invoegen in een nieuwe tabel met de naam PetTypeCount .

We kunnen dit verifiëren met een SELECT verklaring.

SELECT * FROM vPetTypeCount;
SELECT * FROM PetTypeCount;

Resultaat:

+-----------+---------+
| PetType   | Count   |
|-----------+---------|
| Bird      | 1       |
| Cat       | 3       |
| Dog       | 4       |
+-----------+---------+
(3 rows affected)
+-----------+---------+
| PetType   | Count   |
|-----------+---------|
| Bird      | 1       |
| Cat       | 3       |
| Dog       | 4       |
+-----------+---------+
(3 rows affected)

DBMS-ondersteuning

Zoals gezegd, de SELECT INTO statement is een Sybase-extensie en wordt niet door alle belangrijke DBMS'en ondersteund. MySQL en SQLite ondersteunen het bijvoorbeeld niet.

Van de DBMS'en die het wel ondersteunen, varieert de daadwerkelijke implementatie enigszins tussen DBMS. Bovenstaande voorbeelden zijn gemaakt in SQL Server. In MariaDB en Oracle kunt u de bestemmingstabel vervangen door een variabelenaam (of collectienaam in Oracle).

Als uw DBMS de SELECT INTO . niet ondersteunt statement, is de kans groot dat het de INSERT INTO... SELECT . ondersteunt verklaring, dus u moet dat in plaats daarvan proberen.


  1. JSON invoegen in een tabel in SQL Server

  2. Hernoem een ​​door de gebruiker gedefinieerd gegevenstype in SQL Server (T-SQL)

  3. Verouderde functies om uit uw gereedschapskist te halen - Deel 1

  4. vang DB-uitzondering in JSF+EJB-toepassing