sql >> Base de Datos >  >> RDS >> Database

SQL INSERTAR EN… SELECCIONAR Ejemplos

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.