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

SQL INSERT IN… SELECT Esempi

L'SQL INSERT istruzione è più comunemente usata per inserire singole righe in una tabella.

Ma puoi anche inserire i risultati di una query in una tabella. Ciò significa che puoi inserire più righe contemporaneamente (purché vengano restituite dalla query).

Esempio di base

Ecco un esempio di base da dimostrare.

INSERT INTO Pets2
SELECT * FROM Pets;

Ciò inserisce tutte le righe da Pets tabella in Pets2 tabella.

Presuppone che abbiamo già creato Pets2 tabella e che abbia la definizione corretta.

Se non esiste o se non ha la definizione corretta, riceverai un errore.

Inserisci dati da più tabelle

Puoi utilizzare questo metodo per inserire dati da più tabelle.

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 questo esempio ho inserito i dati di tre tabelle in una tabella chiamata PetsTypesOwners .

Nota che ho elencato esplicitamente ogni colonna. L'ho fatto perché la colonna di destinazione ha meno colonne delle tre tabelle combinate. In questo caso, è perché, se avessi selezionato tutte le colonne, la query avrebbe restituito colonne duplicate a causa delle chiavi esterne con lo stesso nome e valore delle chiavi primarie.

Se volessi includere quelle colonne duplicate, la colonna di destinazione dovrebbe includere quelle colonne duplicate, ma con un nome diverso per una di ciascuna coppia duplicata.

Ecco un esempio di selezione di tutte le colonne (le selezionerò esplicitamente qui, così puoi vedere i loro nomi):

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;

Puoi vedere che ci sono due colonne chiamate OwnerId e due chiamati PetTypeId , ognuno da una tabella diversa. Queste sono le chiavi primarie e le chiavi esterne delle rispettive tabelle.

Dato che quelle colonne sono duplicate, ne ho inclusa solo una nell'esempio precedente. Ma ai fini di questa demo, li ho inclusi in questo esempio.

Quindi, per soddisfare questo nuovo INSERT INTO... SELECT istruzione, abbiamo bisogno che la nostra tabella di destinazione abbia il numero corretto di colonne e con una definizione compatibile.

Pertanto, la definizione della nostra tabella di destinazione potrebbe assomigliare a questa:

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 questo caso, ho anteposto a una di ciascuna colonna duplicata Pet . In particolare, ho creato un PetPetTypeId (che si associa a p.OwnerId colonna nella query) e PetOwnerId colonna (che esegue il mapping a p.PetTypeId colonna nella query).

È importante notare, tuttavia, che non importa come chiami le tue colonne nella tabella di destinazione. Il INSERT INTO... SELECT l'affermazione non si preoccupa di questo. Il INSERT INTO... SELECT l'istruzione è interessata solo all'ordine delle colonne.

Inserisci dati da una vista

Puoi usare lo stesso INSERT INTO... SELECT sintassi per inserire dati in una tabella da una vista.

Ecco un rapido esempio:

INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;

In questo caso, vPetTypeCount è una vista e ne sto inserendo il contenuto in una tabella chiamata PetTypeCount .

Inserimento di dati da una stored procedure

Alcuni DBMS (come SQL Server) possono anche utilizzare lo stesso INSERT INTO... SELECT sintassi per inserire dati in una tabella da una procedura memorizzata.

Ecco un rapido esempio:

INSERT INTO PetById
EXEC uspGetPetById 2;

Di nuovo, questo presuppone che abbiamo una tabella di destinazione con la definizione corretta.

Il SELECT INTO Dichiarazione

A seconda del tuo DBMS, c'è anche un SELECT INTO istruzione, che puoi utilizzare per creare automaticamente una nuova tabella in base al set di risultati, quindi inserire quel set di risultati al suo interno.