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

SQL CREATE TABLE... AS SELECT Sentencia

SQL CREATE TABLE ... AS SELECT le permite insertar los resultados de una consulta en una nueva tabla.

Ejemplo básico

Aquí hay un ejemplo básico para demostrar cómo seleccionar e insertar los datos en una nueva tabla.

CREATE TABLE Pets2 AS
(SELECT * FROM Pets);

Esto crea una nueva tabla llamada Pets2 (con la misma definición que Pets ), e inserta los resultados de la consulta en él.

El estándar SQL requiere paréntesis alrededor de la cláusula de subconsulta, pero pueden ser opcionales en su DBMS (por ejemplo, PostgreSQL).

Si seleccionamos ambas tablas, podemos ver que ambas tienen los mismos datos.

barney=# SELECT * FROM Pets;
 petid | pettypeid | ownerid | petname |    dob     
-------+-----------+---------+---------+------------
     1 |         2 |       3 | Fluffy  | 2020-11-20
     2 |         3 |       3 | Fetch   | 2019-08-16
     3 |         2 |       2 | Scratch | 2018-10-01
     4 |         3 |       3 | Wag     | 2020-03-15
     5 |         1 |       1 | Tweet   | 2020-11-28
     6 |         3 |       4 | Fluffy  | 2020-09-17
     7 |         3 |       2 | Bark    | 
     8 |         2 |       4 | Meow    | 
(8 rows)

barney=# SELECT * FROM Pets2;
 petid | pettypeid | ownerid | petname |    dob     
-------+-----------+---------+---------+------------
     1 |         2 |       3 | Fluffy  | 2020-11-20
     2 |         3 |       3 | Fetch   | 2019-08-16
     3 |         2 |       2 | Scratch | 2018-10-01
     4 |         3 |       3 | Wag     | 2020-03-15
     5 |         1 |       1 | Tweet   | 2020-11-28
     6 |         3 |       4 | Fluffy  | 2020-09-17
     7 |         3 |       2 | Bark    | 
     8 |         2 |       4 | Meow    | 
(8 rows)

Cuando la tabla ya existe

Si tratamos de ejecutar CREATE TABLE ... AS SELECT de nuevo, obtenemos un error debido a que la tabla ya existe.

CREATE TABLE Pets2 AS
(SELECT * FROM Pets);

Resultado:

relation "pets2" already exists

Si desea insertar datos en una tabla que ya existe, use INSERT INTO... SELECT declaración. Esto agregará los datos a cualquier dato existente. Es decir, agregará filas nuevas a la tabla y mantendrá las filas existentes.

Filtrar los resultados

El SELECT declaración puede hacer el habitual SELECT cosas de declaraciones, como filtrar los resultados con un WHERE cláusula.

CREATE TABLE Pets3 AS
(SELECT * FROM Pets
WHERE DOB < '2020-06-01');

En este ejemplo, filtro los datos solo para aquellas mascotas que tienen una fecha de nacimiento (DOB) anterior al 1 de junio de 2020.

Selección de varias tablas

Puede seleccionar datos de varias tablas y luego hacer que la definición de la tabla de destino se base en el conjunto de resultados.

CREATE TABLE PetsTypesOwners AS
(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);

Aquí, consultamos tres tablas e insertamos los resultados en una tabla llamada PetsTypesOwners .

Tenga en cuenta que enumeré cada columna aquí porque no quería incluir todas las columnas.

Específicamente, no quería duplicar las columnas de clave principal/clave externa. En mi caso, las claves foráneas comparten los mismos nombres que sus contrapartes de clave principal en la tabla principal, y habría recibido un error debido a la creación de nombres de columna duplicados en la tabla de destino.

Esto es lo que quiero decir.

CREATE TABLE PetsTypesOwners2 AS
(SELECT *
FROM Pets p 
INNER JOIN PetTypes pt 
ON p.PetTypeId = pt.PetTypeId 
INNER JOIN Owners o 
ON p.OwnerId = o.OwnerId);

Resultado:

column "pettypeid" specified more than once

Si sus claves foráneas usan nombres de columna diferentes a las claves primarias, entonces probablemente termine con una tabla de destino que contiene columnas innecesarias (una para la clave principal, otra para la clave externa y cada una con los mismos valores).

Si realmente desea incluir este tipo de columnas duplicadas, pero comparten el mismo nombre, siempre puede usar alias para asignarles un nombre diferente en la tabla de destino.

CREATE TABLE PetsTypesOwners2 AS
(SELECT 
    p.PetId, 
    p.OwnerId AS PetOwnerId, 
    p.PetTypeId AS PetPetTypeId,
    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 caso, utilicé alias de columna para reasignar el nombre de dos columnas a PetOwnerId y PetPetTypeId .

Soporte de DBMS

Aunque CREATE TABLE ... AS SELECT declaración se ajusta al estándar SQL, no es compatible con todos los DBMS. Además, para aquellos que lo admiten, existen variaciones en torno a su implementación.

Por lo tanto, le sugiero que consulte la documentación de su DBMS si desea utilizar esta declaración.

Si usa SQL Server, puede usar SELECT INTO instrucción, que básicamente hace lo mismo.

También está el INSERT INTO ... SELECT declaración que muchos DBMS soportan. Esta instrucción inserta los resultados de la consulta en una tabla existente.