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

Sentencia SQL SELECT INTO

El SQL SELECT INTO es una extensión de Sybase que se puede utilizar para insertar los resultados de una consulta en una tabla (o una variable, según el DBMS).

En DBMS como SQL Server y PostgreSQL, SELECT INTO La declaración crea una nueva tabla e inserta las filas resultantes de la consulta en ella.

En MariaDB inserta el conjunto de resultados en una variable. En Oracle, asigna los valores seleccionados a variables o colecciones.

MySQL y SQLite no son compatibles con SELECT INTO declaración en absoluto.

Los ejemplos de este artículo insertan los conjuntos de resultados en una tabla. En MariaDB y Oracle, la tabla de destino se puede reemplazar por un nombre de variable (o el nombre de la colección si usa Oracle).

Ejemplo básico

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

SELECT * INTO Pets2
FROM Pets;

Este ejemplo crea una tabla llamada Pets2 con la misma definición de la tabla llamada Pets e inserta todos los datos de Pets en Pets2 .

Podemos verificar esto seleccionando el contenido de ambas tablas.

SELECT * FROM Pets;
SELECT * FROM Pets2;

Resultado:

+---------+-------------+-----------+-----------+------------+
| 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      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+
(8 rows affected)
+---------+-------------+-----------+-----------+------------+
| 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      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+
(8 rows affected)

Cuando la tabla ya existe

Si intentamos ejecutar SELECT INTO de nuevo, obtenemos un error debido a que la tabla ya existe.

SELECT * INTO Pets2
FROM Pets;

Resultado:

Msg 2714, Level 16, State 6, Line 1
There is already an object named 'Pets2' in the database.

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.

SELECT * INTO Pets3
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.

SELECT
    p.PetId,
    p.PetName,
    p.DOB,
    pt.PetTypeId,
    pt.PetType,    
    o.OwnerId,
    o.FirstName,
    o.LastName,
    o.Phone,
    o.Email
INTO PetsTypesOwners
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.

SELECT *
INTO PetsTypesOwners2
FROM Pets p 
INNER JOIN PetTypes pt 
ON p.PetTypeId = pt.PetTypeId 
INNER JOIN Owners o 
ON p.OwnerId = o.OwnerId;

Resultado:

Msg 2705, Level 16, State 3, Line 1
Column names in each table must be unique. Column name 'PetTypeId' in table 'PetsTypesOwners2' is 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.

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
INTO PetsTypesOwners3
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 .

SELECCIONAR EN Desde una vista

También puede seleccionar datos de una vista si es necesario.

SELECT * INTO PetTypeCount
FROM vPetTypeCount;

Esto selecciona datos del vPetTypeCount ver y lo inserta en una nueva tabla llamada PetTypeCount .

Podemos verificar esto con un SELECT declaración.

SELECT * FROM vPetTypeCount;
SELECT * FROM PetTypeCount;

Resultado:

+-----------+---------+
| PetType   | Count   |
|-----------+---------|
| Bird      | 1       |
| Cat       | 3       |
| Dog       | 4       |
+-----------+---------+
(3 rows affected)
+-----------+---------+
| PetType   | Count   |
|-----------+---------|
| Bird      | 1       |
| Cat       | 3       |
| Dog       | 4       |
+-----------+---------+
(3 rows affected)

Soporte de DBMS

Como se mencionó, SELECT INTO es una extensión de Sybase y no es compatible con todos los DBMS principales. Por ejemplo, MySQL y SQLite no lo admiten.

Además, de los DBMS que lo admiten, la implementación real varía un poco entre DBMS. Los ejemplos anteriores se realizaron en SQL Server. En MariaDB y Oracle, puede reemplazar la tabla de destino con un nombre de variable (o nombre de colección en Oracle).

Si su DBMS no es compatible con SELECT INTO declaración, lo más probable es que admita INSERT INTO... SELECT declaración, por lo que debería intentar eso en su lugar.