El SQL INSERT
se usa más comúnmente para insertar filas individuales en una tabla.
Pero también puede insertar los resultados de una consulta en una tabla. Esto significa que puede insertar varias filas a la vez (siempre que la consulta las devuelva).
Ejemplo básico
Aquí hay un ejemplo básico para demostrarlo.
INSERT INTO Pets2
SELECT * FROM Pets;
Eso inserta todas las filas de Pets
tabla en Pets2
mesa.
Se supone que ya hemos creado las Pets2
tabla y que tiene la definición correcta.
Si no existe o si no tiene la definición correcta, recibirá un error.
Insertar datos de varias tablas
Puede utilizar este método para insertar datos de varias tablas.
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;
En este ejemplo, inserté datos de tres tablas en una tabla llamada PetsTypesOwners
.
Tenga en cuenta que enumeré explícitamente cada columna. Hice esto porque la columna de destino tiene menos columnas que las tres tablas combinadas. En este caso, es porque, si hubiera seleccionado todas las columnas, la consulta habría devuelto columnas duplicadas debido a que las claves externas tienen el mismo nombre y valor que sus claves principales.
Si quisiera incluir esas columnas duplicadas, la columna de destino tendría que incluir esas columnas duplicadas, pero con un nombre diferente para cada par duplicado.
Este es un ejemplo de selección de todas las columnas (las seleccionaré explícitamente aquí para que pueda ver sus nombres):
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;
Puede ver que hay dos columnas llamadas OwnerId
y dos llamados PetTypeId
, cada uno de una tabla diferente. Estas son las claves primarias y las claves foráneas de sus respectivas tablas.
Dado que esas columnas son duplicadas, solo incluí una de cada una en el ejemplo anterior. Pero para el propósito de esta demostración, los he incluido en este ejemplo.
Entonces, para atender este nuevo INSERT INTO... SELECT
instrucción, necesitamos que nuestra tabla de destino tenga el número correcto de columnas y con una definición compatible.
Por lo tanto, la definición de nuestra tabla de destino podría verse así:
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)
);
En este caso, prefijé una de cada columna duplicada con Pet
. Específicamente, creé un PetPetTypeId
(que se asigna a p.OwnerId
columna en la consulta) y PetOwnerId
columna (que se asigna a la p.PetTypeId
columna en la consulta).
Sin embargo, es importante tener en cuenta que no importa cómo llame a sus columnas en la tabla de destino. INSERT INTO... SELECT
declaración no se preocupa por eso. INSERT INTO... SELECT
La declaración solo está interesada en el orden de las columnas.
Insertar datos desde una vista
Puede usar el mismo INSERT INTO... SELECT
sintaxis para insertar datos en una tabla desde una vista.
He aquí un ejemplo rápido:
INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;
En este caso, vPetTypeCount
es una vista, y estoy insertando su contenido en una tabla llamada PetTypeCount
.
Insertar datos de un procedimiento almacenado
Algunos DBMS (como SQL Server) también pueden usar el mismo INSERT INTO... SELECT
sintaxis para insertar datos en una tabla desde un procedimiento almacenado.
He aquí un ejemplo rápido:
INSERT INTO PetById
EXEC uspGetPetById 2;
Nuevamente, esto supone que tenemos una tabla de destino con la definición correcta.
El SELECT INTO
Declaración
Dependiendo de su DBMS, también hay un SELECT INTO
declaración, que puede usar para crear automáticamente una nueva tabla basada en el conjunto de resultados, luego inserte ese conjunto de resultados en ella.