SQLShack (Italiano)
Questo articolo tratta listruzione SQL INSERT INTO SELECT insieme alla sua sintassi, esempi e casi duso.
Nel mio articolo precedente Istruzione SQL SELECT INTO, abbiamo esplorato le seguenti attività.
- Crea una tabella SQL al volo inserendo record con tipi di dati appropriati
- Usa SQL SELECT INTO per inserire record in un particolare FileGroup
- Non possiamo usarlo per inserire dati in una tabella esistente
Listruzione INSERT INTO SELECT
Vogliamo inserire record come una normale attività di database. Possiamo inserire dati direttamente utilizzando strumenti client come SSMS, Azure Data Studio o direttamente da unapplicazione. In SQL, usiamo listruzione SQL INSERT INTO per inserire record.
La sintassi di INSERT INTO
Una volta inseriti i dati nella tabella, possiamo usare la seguente sintassi per il nostro Istruzione SQL INSERT INTO.
1
2
|
INSERT INTO table_name (Column1, Column 2 ….)
VALUES (value1, value2, …);
|
Se abbiamo specificato tutti i valori delle colonne come da colonna della tabella ordini, non è necessario specificare i nomi delle colonne. Possiamo inserire direttamente i record nella tabella.
1
2
|
INSERT INTO table_name
VALUES (value1, value2, …);
|
Creiamo una tabella di esempio e inseriamo i dati in essa .
1
2
3
4
|
CREA TABELLA Dipendenti
(ID INT,
Nome VARCHAR (20)
);
|
Possiamo inserire dati utilizzando le seguenti query. Entrambe le query sono valide per linserimento dei dati.
1
2
|
Inserisci nei valori dei dipendenti (ID, nome) (1, “raj”)
Inserisci nei valori dei dipendenti (2, “raj”)
|
Non possiamo inserire dati senza specificare i nomi delle colonne se cè un la mancata corrispondenza tra linserimento dei dati e lordine dei valori delle colonne è diversa. È possibile ottenere il seguente messaggio di errore.
- Msg 213, Livello 16, Stato 1, Riga 6
Il nome della colonna o il numero di valori forniti non definizione della tabella delle corrispondenze.
- Messaggio 245, livello 16, stato 1, riga 6
Conversione non riuscita durante la conversione del valore varchar “raj” nel tipo di dati int.
In questo esempio, useremo listruzione SQL INSERT INTO fornendo i valori direttamente in unistruzione. Supponiamo di voler inserire dati da unaltra tabella. Possiamo ancora utilizzare listruzione SQL INSERT INTO con unistruzione select. Analizziamolo nella sezione successiva.
Sintassi dellistruzione INSERT INTO SELECT
Possiamo inserire dati da altre tabelle SQL in una tabella con la seguente istruzione INSERT INTO SELECT.
1
2
3
|
INSERT INTO table1 (col1, col2, col3,…)
SELECT col1, col2, col3,…
FROM table2
|
Questa query esegue le seguenti attività:
- Prima seleziona i record da una tabella (istruzione Select)
- Successivamente, inserisce in una tabella specificata con INSERT INTO
- Nota: la struttura della colonna deve corrispondere tra la colonna restituita dallistruzione SELECT e la tabella di destinazione.
INSERT INTO SELECT esempi
Esempio 1: inserisci i dati da tutte le colonne della tabella sorgente nella tabella di destinazione
Abbiamo i seguenti record in tabella Employee esistente.
Creiamo unaltra tabella Customers con la seguente query.
1
2
3
4
|
CREATE TABLE Clienti
(ID INT,
Nome VARCHAR (20)
);
|
Vogliamo inserire tutti i record dalla tabella Employees a la tabella Clienti. Possiamo usare listruzione SQL INSERT INTO SELECT per farlo.
1
2
3
|
INSERT INTO Customers
SELECT *
FROM Employees;
|
Inserisce tutti i record nella tabella Clienti. Possiamo verificare che i record nella tabella Customers siano simili alla tabella Employees.
In questo esempio, abbiamo inserito record per tutti colonne alla tabella Clienti.
Esempio 2: inserire righe dalla tabella di origine a quella di destinazione specificando i nomi delle colonne
Eliminiamo la tabella Clienti esistente prima di andare avanti. Ora, vogliamo creare una tabella con una colonna IDENTITY aggiuntiva. La colonna IDENTITY inserisce automaticamente i valori di identità in una tabella. Abbiamo anche aggiunto una colonna Città che consente valori NULL
1
2
3
4
5
6
|
CREA TABELLA Clienti
(ID INT IDENTITY (1, 1),
Emp_ID INT,
Nome VARCHAR (20),
Città VARCHAR (20) NULL,
);
|
Non possiamo usare listruzione INSERT INTO SELECT simile alla sopra lesempio. Se proviamo a eseguire questo codice, otteniamo un messaggio di errore.
1
2
3
|
INSERT INTO Customers
SELECT *
FROM Employees ;
|
In questo caso, dobbiamo specificare il nome della colonna con listruzione INSERT INTO.
1
2
3
|
INSERT INTO Customers (Emp_ID, Name)
SELEZIONA *
DA Dipendenti;
|
Nella tabella Clienti, abbiamo una colonna aggiuntiva con consente valori NULL. Eseguiamo una tabella Seleziona su clienti. Nello screenshot seguente, possiamo vedere i valori NULL nella colonna Città.
Supponi di avere una colonna diversa nella tabella di origine. È comunque possibile inserire record nella tabella di destinazione specificando i nomi delle colonne nellistruzione INSERT INTO SELECT. Dovremmo avere un tipo di dati appropriato per inserire i dati. Non è possibile inserire i dati di una colonna varchar in una colonna INT.
Aggiungi una nuova colonna nella tabella Employees utilizzando listruzione ALTER TABLE.
1
2
|
ALTER TABLE Dipendenti
ADD Paese varchar (50);
|
Aggiorna i record della tabella con il valore del paese India.
1
|
Aggiorna set dipendenti Paese = “India”
|
Ora, riesegui INSERT INTO Istruzione SELECT. Puoi notare che stiamo utilizzando SELECT * invece di specificare i nomi delle colonne.
1
2
3
|
INSERT INTO Customers (Emp_ID, Name)
SELECT *
DA dipendenti;
|
Otteniamo il seguente messaggio di errore. Questo errore si verifica a causa della mancata corrispondenza della colonna tra la tabella di origine e la tabella di destinazione.
Possiamo mappare la colonna tra la tabella di origine e quella di destinazione utilizzando la seguente query.
1
2
3
4
5
6
|
INSERT INTO Customers
(Emp_ID,
Nome
)
SELEZIONA ID, Nome
DA Dipendenti;
|
Esempio 3: inserire le prime righe utilizzando INSERT INTO SELECT istruzione
Supponiamo di voler inserire le prime N righe dalla tabella di origine alla tabella di destinazione. Possiamo usare la clausola Top nellistruzione INSERT INTO SELECT. Nella query seguente, inserisce la prima riga della tabella Employees nella tabella Customers.
1
2
3
4
5
6
|
INSERT TOP (1) INTO Customers
(Emp_ID,
Name
)
SELECT ID, nome
FROM Employees;
|
Esempio 4: inserire utilizzando entrambe le colonne e i valori definiti in listruzione SQL INSERT INTO SELECT
Negli esempi precedenti, abbiamo specificato valori specifici nellistruzione INSERT INTO o utilizzato INSERT INTO SELECT per ottenere i record dalla tabella di origine e inserirli nella tabella di destinazione.
Possiamo combinare sia le colonne che i valori definiti nellistruzione SQL INSERT INTO SELECT.
Abbiamo le seguenti colonne nella tabella Clienti e Dipendenti. In precedenza, non abbiamo inserito alcun valore per la colonna Città. Non abbiamo i valori richiesti anche nella tabella Employee. Dobbiamo specificare un valore esplicito per la colonna Città.
Nella seguente query, abbiamo specificato un valore per Città colonna mentre il resto dei valori che abbiamo inserito dalla tabella Employees.
1
2
|
INSERT TOP (1) INTO Customers (Emp_ID, Name, City)
SELECT ID, Name, “Delhi” DA Dipendenti;
|
Nella seguente query, possiamo vedere che ne inserisce uno riga (a causa della clausola Top (1)) insieme al valore per la colonna Città.
Esempio 5: INSERT INTO SELECT istruzione con clausola Join per ottenere dati da più tabelle
Possiamo utilizzare una clausola JOIN per ottenere dati da più tabelle. Queste tabelle sono unite alle condizioni specificate con la clausola ON. Supponiamo di voler ottenere dati da più tabelle e inserirli in una tabella.
In questo esempio, sto utilizzando il database AdventureWorks2017. Innanzitutto, crea una nuova tabella con i tipi di dati appropriati.
Questa tabella dovrebbe contenere record dalloutput di una query di join di più tabelle. Esegui la seguente query per inserire dati nella tabella HumanResources.EmployeeData.
Esempio 6: istruzione INSERT INTO SELECT con espressione di tabella comune
Usiamo espressioni di tabella comuni (CTE) per semplificare il join complesso da più colonne. Nellesempio precedente, abbiamo utilizzato JOINS in unistruzione Select per inserire dati in una tabella SQL. In questa parte, riscriveremo la query con CTE.
In una CTE, possiamo dividere il codice in due parti.
- Definiamo CTE da una clausola WITH prima dellistruzione SELECT, INSERT, UPDATE, DELETE
- Una volta definita la CTE, possiamo fare riferimento alla CTE in modo simile a una tabella SQL relazionale
Esegui il seguente codice per inserire dati utilizzando una CTE.
Esempio 7 : INSERT INTO SELECT istruzione con una variabile di tabella
Usiamo le variabili di tabella in modo simile a una tabella temporanea. Possiamo dichiararli usando il tipo di dati table. Questa tabella può essere utilizzata per eseguire attività in SQL Server in cui non è necessaria una tabella permanente. È possibile dividere la seguente query in tre parti.
- Creare una variabile di tabella SQL con i tipi di dati di colonna appropriati. Dobbiamo utilizzare il tipo di dati TABLE per la variabile di tabella
- Esegui unistruzione INSERT INTO SELECT per inserire dati in una variabile di tabella
- Visualizza il set di risultati della variabile di tabella
Conclusione
In questo articolo, esploriamo i casi duso dellistruzione INSERT INTO SELECT. Spero che questo articolo ti sia stato utile. Sentiti libero di fornire un feedback nei commenti qui sotto.
- Autore
- Post recenti
È lautore di una delle più grandi raccolte online gratuite di articoli su un singolo argomento, con la sua serie di 50 parti sui gruppi di disponibilità Always On di SQL Server. Sulla base del suo contributo alla comunità di SQL Server, è stato riconosciuto con vari premi tra cui il prestigioso “Miglior autore dellanno” ininterrottamente nel 2020 e 2021 a SQLShack.
Raj è sempre interessato a nuove sfide, quindi se hai bisogno di consulenza aiuto su qualsiasi argomento trattato nei suoi scritti, può essere raggiunto a [email protected]
Visualizza tutti i post di Rajendra Gupta
- Esecuzione di aggiornamenti delle versioni minori e principali per AWS RDS SQL Server – 29 gennaio 2021
- Distribuzione di istanze PostgreSQL di AWS RDS – 27 gennaio 2021
- Migrazione dei database SQL locali ad AWS RDS SQL Server utilizzando AWS DMS – 25 gennaio , 2021