Database
 sql >> Base de données >  >> RDS >> Database

SQL INSERT INTO… SELECT Exemples

Le SQL INSERT est le plus souvent utilisé pour insérer des lignes individuelles dans un tableau.

Mais vous pouvez également insérer les résultats d'une requête dans une table. Cela signifie que vous pouvez insérer plusieurs lignes à la fois (tant qu'elles sont renvoyées par la requête).

Exemple de base

Voici un exemple de base pour illustrer.

INSERT INTO Pets2
SELECT * FROM Pets;

Cela insère toutes les lignes de Pets table dans Pets2 tableau.

Il suppose que nous avons déjà créé le Pets2 table et qu'elle a la bonne définition.

S'il n'existe pas ou s'il n'a pas la bonne définition, vous obtiendrez une erreur.

Insérer des données de plusieurs tables

Vous pouvez utiliser cette méthode pour insérer des données à partir de plusieurs tables.

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;

Dans cet exemple, j'ai inséré des données de trois tables dans une table appelée PetsTypesOwners .

Notez que j'ai explicitement listé chaque colonne. J'ai fait cela parce que la colonne de destination a moins de colonnes que les trois tables combinées. Dans ce cas, c'est parce que, si j'avais sélectionné toutes les colonnes, la requête aurait renvoyé des colonnes en double en raison de clés étrangères ayant le même nom et la même valeur que leurs clés primaires.

Si je voulais inclure ces colonnes en double, la colonne de destination devrait inclure ces colonnes en double, mais avec un nom différent pour une de chaque paire en double.

Voici un exemple de sélection de toutes les colonnes (je les sélectionnerai explicitement ici, afin que vous puissiez voir leurs noms) :

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;

Vous pouvez voir qu'il y a deux colonnes appelées OwnerId et deux appelés PetTypeId , chacun d'une table différente. Ce sont les clés primaires et les clés étrangères de leurs tables respectives.

Étant donné que ces colonnes sont des doublons, je n'en ai inclus qu'une de chaque dans l'exemple précédent. Mais pour les besoins de cette démo, je les ai inclus dans cet exemple.

Donc, pour répondre à ce nouveau INSERT INTO... SELECT déclaration, nous avons besoin que notre table de destination ait le nombre correct de colonnes et avec une définition compatible.

Par conséquent, la définition de notre table de destination pourrait ressembler à ceci :

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

Dans ce cas, j'ai préfixé une de chaque colonne en double avec Pet . Plus précisément, j'ai créé un PetPetTypeId (qui correspond au p.OwnerId colonne dans la requête) et PetOwnerId colonne (qui correspond à la colonne p.PetTypeId colonne dans la requête).

Il est important de noter cependant que peu importe comment vous appelez vos colonnes dans la table de destination. Le INSERT INTO... SELECT déclaration ne se soucie pas de cela. Le INSERT INTO... SELECT L'instruction ne s'intéresse qu'à l'ordre des colonnes.

Insérer des données à partir d'une vue

Vous pouvez utiliser le même INSERT INTO... SELECT syntaxe pour insérer des données dans une table à partir d'une vue.

Voici un exemple rapide :

INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;

Dans ce cas, vPetTypeCount est une vue, et j'insère son contenu dans une table appelée PetTypeCount .

Insérer des données à partir d'une procédure stockée

Certains SGBD (tels que SQL Server) peuvent également utiliser le même INSERT INTO... SELECT syntaxe pour insérer des données dans une table à partir d'une procédure stockée.

Voici un exemple rapide :

INSERT INTO PetById
EXEC uspGetPetById 2;

Encore une fois, cela suppose que nous avons une table de destination avec la bonne définition.

Le SELECT INTO Déclaration

Selon votre SGBD, il y a aussi un SELECT INTO , que vous pouvez utiliser pour créer automatiquement une nouvelle table basée sur le jeu de résultats, puis insérez-y ce jeu de résultats.