Database
 sql >> Base de Dados >  >> RDS >> Database

SQL INSERT INTO… SELECT Exemplos


O SQL INSERT A instrução é mais comumente usada para inserir linhas individuais em uma tabela.

Mas você também pode inserir os resultados de uma consulta em uma tabela. Isso significa que você pode inserir várias linhas de uma vez (desde que sejam retornadas pela consulta).

Exemplo básico


Aqui está um exemplo básico para demonstrar.
INSERT INTO Pets2
SELECT * FROM Pets;

Isso insere todas as linhas do Pets tabela em Pets2 tabela.

Ele assume que já criamos o Pets2 tabela e que tem a definição correta.

Se não existir ou se não tiver a definição correta, você receberá um erro.

Inserir dados de várias tabelas


Você pode usar esse método para inserir dados de várias tabelas.
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;

Neste exemplo, inseri dados de três tabelas em uma tabela chamada PetsTypesOwners .

Observe que listei explicitamente cada coluna. Eu fiz isso porque a coluna de destino tem menos colunas do que as três tabelas combinadas. Nesse caso, é porque, se eu tivesse selecionado todas as colunas, a consulta teria retornado colunas duplicadas devido a chaves estrangeiras com o mesmo nome e valor de suas chaves primárias.

Se eu quisesse incluir essas colunas duplicadas, a coluna de destino precisaria incluir essas colunas duplicadas, mas com um nome diferente para cada par duplicado.

Aqui está um exemplo de seleção de todas as colunas (vou selecioná-las explicitamente aqui, para que você possa ver seus nomes):
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;

Você pode ver que existem duas colunas chamadas OwnerId e dois chamados PetTypeId , cada um de uma tabela diferente. Essas são as chaves primárias e estrangeiras de suas respectivas tabelas.

Dado que essas colunas são duplicadas, incluí apenas uma de cada no exemplo anterior. Mas para o propósito desta demonstração, incluí-os neste exemplo.

Então, para atender a este novo INSERT INTO... SELECT , precisamos que nossa tabela de destino tenha o número correto de colunas e com uma definição compatível.

Portanto, a definição da nossa tabela de destino pode ser algo assim:
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)
);

Nesse caso, prefixei uma de cada coluna duplicada com Pet . Especificamente, criei um PetPetTypeId (que mapeia para o p.OwnerId coluna na consulta) e PetOwnerId coluna (que mapeia para o p.PetTypeId coluna na consulta).

É importante notar, porém, que não importa como você chama suas colunas na tabela de destino. O INSERT INTO... SELECT declaração não se importa com isso. O INSERT INTO... SELECT instrução está interessada apenas na ordem das colunas.

Inserir dados de uma visualização


Você pode usar o mesmo INSERT INTO... SELECT sintaxe para inserir dados em uma tabela de uma exibição.

Aqui está um exemplo rápido:
INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;

Nesse caso, vPetTypeCount é uma view, e estou inserindo seu conteúdo em uma tabela chamada PetTypeCount .

Inserir dados de um procedimento armazenado


Alguns DBMSs (como SQL Server) também podem usar o mesmo INSERT INTO... SELECT sintaxe para inserir dados em uma tabela de um procedimento armazenado.

Aqui está um exemplo rápido:
INSERT INTO PetById
EXEC uspGetPetById 2;

Novamente, isso pressupõe que temos uma tabela de destino com a definição correta.

O SELECT INTO Declaração


Dependendo do seu DBMS, há também um SELECT INTO declaração, que você pode usar para criar automaticamente uma nova tabela com base no conjunto de resultados e, em seguida, inserir esse conjunto de resultados nela.