SQL CREATE TABLE ... AS SELECT
операторът ви позволява да вмъкнете резултатите от заявка в нова таблица.
Основен пример
Ето основен пример за демонстриране на избор и вмъкване на данните в нова таблица.
CREATE TABLE Pets2 AS
(SELECT * FROM Pets);
Това създава нова таблица, наречена Pets2
(със същата дефиниция като Pets
) и вмъква резултатите от заявката в него.
SQL стандартът изисква скоби около клаузата за подзаявка, но те може да са по избор във вашата СУБД (например PostgreSQL).
Ако изберем и двете таблици, можем да видим, че и двете имат едни и същи данни.
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)
Когато таблицата вече съществува
Ако се опитаме да изпълним CREATE TABLE ... AS SELECT
отново получаваме грешка, поради вече съществуващата таблица.
CREATE TABLE Pets2 AS
(SELECT * FROM Pets);
Резултат:
relation "pets2" already exists
Ако искате да вмъкнете данни в таблица, която вече съществува, използвайте INSERT INTO... SELECT
изявление. Това ще добави данните към всички съществуващи данни. Тоест ще добавя нови редове към таблицата, като запазва всички съществуващи редове.
Филтриране на резултатите
SELECT
оператор може да направи обичайния SELECT
неща, като например филтриране на резултатите с WHERE
клауза.
CREATE TABLE Pets3 AS
(SELECT * FROM Pets
WHERE DOB < '2020-06-01');
В този пример филтрирам данните само за тези домашни любимци, които имат дата на раждане (DOB) от преди 1 юни 2020 г.
Избиране от множество таблици
Можете да изберете данни от множество таблици, след което дефиницията на таблицата местоназначение да се базира на набора от резултати.
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);
Тук правим заявка за три таблици и вмъкваме резултатите в таблица, наречена PetsTypesOwners
.
Имайте предвид, че изброих всяка колона тук, защото не исках да включвам всички колони.
По-конкретно, не исках да удвоявам колоните за външен ключ/първичен ключ. В моя случай външните ключове споделят същите имена като техните двойници на първичния ключ в родителската таблица и бих получил грешка поради създаване на дублиращи се имена на колони в таблицата местоназначение.
Ето какво имам предвид.
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);
Резултат:
column "pettypeid" specified more than once
Ако вашите външни ключове използват различни имена на колони спрямо първичните ключове, тогава вероятно ще се окажете с целева таблица, която съдържа ненужни колони (една за първичния ключ, една за външния ключ и всяка съдържаща едни и същи стойности).
Ако наистина искате да включите такива дублиращи се колони, но те споделят едно и също име, винаги можете да използвате псевдоними, за да им присвоите различно име в целевата таблица.
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);
В този случай използвах псевдоними на колони, за да пренастроя името на две колони на PetOwnerId
и PetPetTypeId
.
Поддръжка на СУБД
Въпреки че CREATE TABLE ... AS SELECT
изразът отговаря на SQL стандарта, той не се поддържа от всички СУБД. Освен това за тези, които го поддържат, има вариации около прилагането му.
Затова предлагам да проверите с документацията на вашата СУБД, ако искате да използвате това изявление.
Ако използвате SQL Server, можете да използвате SELECT INTO
изявление, което по същество прави същото.
Има и INSERT INTO ... SELECT
твърдение, което много СУБД поддържат. Този израз вмъква резултатите от заявката в съществуваща таблица.