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

SQL INSERT INTO… SELECT Beispiele

Das SQL INSERT -Anweisung wird am häufigsten verwendet, um einzelne Zeilen in eine Tabelle einzufügen.

Sie können aber auch die Ergebnisse einer Abfrage in eine Tabelle einfügen. Das bedeutet, dass Sie mehrere Zeilen gleichzeitig einfügen können (solange sie von der Abfrage zurückgegeben werden).

Einfaches Beispiel

Hier ist ein einfaches Beispiel zur Veranschaulichung.

INSERT INTO Pets2
SELECT * FROM Pets;

Das fügt alle Zeilen aus den Pets ein Tabelle in Pets2 Tabelle.

Es wird davon ausgegangen, dass wir Pets2 bereits erstellt haben Tabelle und dass sie die richtige Definition hat.

Wenn es nicht existiert oder nicht die richtige Definition hat, erhalten Sie eine Fehlermeldung.

Daten aus mehreren Tabellen einfügen

Sie können diese Methode verwenden, um Daten aus mehreren Tabellen einzufügen.

INSERT INTO PetsTypesOwners
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;

In diesem Beispiel habe ich Daten aus drei Tabellen in eine Tabelle namens PetsTypesOwners eingefügt .

Beachten Sie, dass ich jede Spalte explizit aufgelistet habe. Ich habe dies getan, weil die Zielspalte weniger Spalten hat als die drei Tabellen zusammen. In diesem Fall liegt das daran, dass die Abfrage doppelte Spalten zurückgegeben hätte, wenn ich alle Spalten ausgewählt hätte, da Fremdschlüssel denselben Namen und denselben Wert wie ihre Primärschlüssel haben.

Wenn ich diese doppelten Spalten einschließen wollte, müsste die Zielspalte diese doppelten Spalten enthalten, aber mit einem anderen Namen für eine von jedem doppelten Paar.

Hier ist ein Beispiel für die Auswahl aller Spalten (ich wähle sie hier explizit aus, damit Sie ihre Namen sehen können):

INSERT INTO PetsTypesOwners2
SELECT 
    p.PetId, 
    p.OwnerId, 
    p.PetTypeId,
    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;

Sie können sehen, dass es zwei Spalten namens OwnerId gibt und zwei namens PetTypeId , jeweils aus einer anderen Tabelle. Dies sind die Primärschlüssel und Fremdschlüssel ihrer jeweiligen Tabellen.

Da es sich bei diesen Spalten um Duplikate handelt, habe ich im vorherigen Beispiel nur jeweils eine eingefügt. Aber für diese Demo habe ich sie in dieses Beispiel aufgenommen.

Also, um diesem neuen INSERT INTO... SELECT gerecht zu werden -Anweisung benötigen wir unsere Zieltabelle, um die richtige Anzahl von Spalten und eine kompatible Definition zu haben.

Daher könnte die Definition unserer Zieltabelle etwa so aussehen:

CREATE TABLE PetsTypesOwners2 (
    PetId       int NOT NULL PRIMARY KEY,
    PetPetType  varchar(60) NOT NULL,
    PetOwnerId  int NOT NULL,
    PetName     varchar(60) NOT NULL,
    DOB         date NULL,
    PetTypeId   int NOT NULL,
    PetType     varchar(60) NOT NULL,
    OwnerId     int NOT NULL,
    FirstName   varchar(60) NOT NULL,
    LastName    varchar(60) NOT NULL,
    Phone       varchar(20) NOT NULL,
    Email       varchar(254)
);

In diesem Fall habe ich einer jeder doppelten Spalte Pet vorangestellt . Insbesondere habe ich eine PetPetTypeId erstellt (was der p.OwnerId zugeordnet ist Spalte in der Abfrage) und PetOwnerId Spalte (die der p.PetTypeId zugeordnet ist Spalte in der Abfrage).

Es ist jedoch wichtig zu beachten, dass es keine Rolle spielt, wie Sie Ihre Spalten in der Zieltabelle nennen. Der INSERT INTO... SELECT Aussage kümmert sich nicht darum. Der INSERT INTO... SELECT -Anweisung ist nur an der Spaltenreihenfolge interessiert.

Daten aus einer Ansicht einfügen

Sie können denselben INSERT INTO... SELECT verwenden Syntax zum Einfügen von Daten in eine Tabelle aus einer Ansicht.

Hier ist ein kurzes Beispiel:

INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;

In diesem Fall vPetTypeCount ist eine Ansicht, und ich füge ihren Inhalt in eine Tabelle namens PetTypeCount ein .

Daten aus einer gespeicherten Prozedur einfügen

Einige DBMS (wie SQL Server) können auch denselben INSERT INTO... SELECT verwenden Syntax zum Einfügen von Daten in eine Tabelle aus einer gespeicherten Prozedur.

Hier ist ein kurzes Beispiel:

INSERT INTO PetById
EXEC uspGetPetById 2;

Dies setzt wiederum voraus, dass wir eine Zieltabelle mit der richtigen Definition haben.

Der SELECT INTO Erklärung

Abhängig von Ihrem DBMS gibt es auch einen SELECT INTO -Anweisung, die Sie verwenden können, um automatisch eine neue Tabelle basierend auf der Ergebnismenge zu erstellen, und fügen Sie dann diese Ergebnismenge darin ein.