SQL CREATE TABLE ... AS SELECT
ステートメントを使用すると、クエリの結果を新しいテーブルに挿入できます。
基本的な例
これは、データを選択して新しいテーブルに挿入する方法を示す基本的な例です。
CREATE TABLE Pets2 AS
(SELECT * FROM Pets);
これにより、Pets2
という新しいテーブルが作成されます (Pets
と同じ定義 )、クエリ結果を挿入します。
SQL標準では、サブクエリ句を括弧で囲む必要がありますが、DBMS(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');
この例では、2020年6月1日より前の生年月日(DOB)を持つペットのみにデータをフィルタリングします。
複数のテーブルからの選択
複数のテーブルからデータを選択し、結果セットに基づいて宛先テーブルの定義を設定できます。
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);
ここでは、3つのテーブルをクエリし、その結果をPetsTypesOwners
というテーブルに挿入します。 。
すべての列を含めたくなかったので、ここに各列をリストしたことに注意してください。
具体的には、外部キー/主キーの列を2倍にしたくありませんでした。私の場合、外部キーは親テーブルの主キーと同じ名前を共有しており、宛先テーブルに重複する列名が作成されているため、エラーが発生していました。
これが私の言いたいことです。
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
外部キーが主キーとは異なる列名を使用している場合、不要な列を含む宛先テーブルが作成される可能性があります(1つは主キー用、もう1つは外部キー用で、それぞれに同じ値が含まれます)。
このような重複する列を本当に含めたいが、それらが同じ名前を共有している場合は、いつでもエイリアスを使用して、宛先テーブルで別の名前を割り当てることができます。
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);
この場合、列エイリアスを使用して、2つの列の名前をPetOwnerId
に再割り当てしました。 およびPetPetTypeId
。
DBMSサポート
CREATE TABLE ... AS SELECT
ステートメントはSQL標準に準拠しており、すべてのDBMSでサポートされているわけではありません。また、それをサポートしている人のために、その実装にはさまざまなバリエーションがあります。
したがって、このステートメントを使用する場合は、DBMSのドキュメントを確認することをお勧めします。
SQL Serverを使用している場合は、SELECT INTO
を使用できます。 基本的に同じことを行うステートメント。
INSERT INTO... SELECT
もあります 多くのDBMSがサポートするステートメント。このステートメントは、クエリ結果を既存のテーブルに挿入します。