sql >> データベース >  >> RDS >> Database

SQLCREATETABLE…ASSELECTステートメント

    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がサポートするステートメント。このステートメントは、クエリ結果を既存のテーブルに挿入します。


    1. 繰り返しなしでSQLiteからボタンにテキストをランダムに設定するにはどうすればよいですか?

    2. 10進数のNLS_NUMERIC_CHARACTERS設定

    3. PostgreSQL + Hibernate+Spring自動作成データベース

    4. PostgreSQLarray_aggの順序