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

SQLクロス結合

    この記事では、CROSS JOINの概要を説明します。 SQL、およびいくつかの基本的な例。

    SQL CROSS JOIN (またはFULL OUTER JOIN )は、最初のテーブルの各行と2番目のテーブルの各行を組み合わせた行を返します。

    つまり、結合内のテーブルから行のデカルト積を返します。

    構文

    FROMでクロス結合を指定します 句。

    構文は次のようになります:

    SELECT *
    FROM Table1 CROSS JOIN Table2 
    ON Table1.Column = Table2.Column;

    例1

    実例を示します。

    サンプルデータ

    まず、例で使用するテーブルを次に示します。

    t1 テーブル:

    +--------+
    | col1   |
    |--------|
    | a      |
    | b      |
    | c      |
    +--------+

    t2 テーブル:

    +--------+
    | col1   |
    |--------|
    | 1      |
    | 2      |
    | 3      |
    +--------+

    クロス結合クエリ

    これら2つのテーブルに対してクロス結合を実行する例を次に示します。

    SELECT * FROM t1 
    CROSS JOIN t2;

    結果:

    +--------+--------+
    | col1   | col1   |
    |--------+--------|
    | a      | 1      |
    | b      | 1      |
    | c      | 1      |
    | a      | 2      |
    | b      | 2      |
    | c      | 2      |
    | a      | 3      |
    | b      | 3      |
    | c      | 3      |
    +--------+--------+
    (9 rows affected)

    したがって、各テーブルに3行しかない場合でも、クエリは9行を返します。

    これは、クロスジョインの仕組みによるものです。返される行数は、左側のテーブルの行数に右側のテーブルの行数を掛けたものです。

    左側のテーブルを繰り返し処理し、左側のテーブルの各行に対して右側のテーブルの各行を出力する方法を確認してください。

    これは、次のことを行うのと同じ効果があります。

    SELECT * FROM t1, t2

    結果:

    +--------+--------+
    | col1   | col1   |
    |--------+--------|
    | a      | 1      |
    | b      | 1      |
    | c      | 1      |
    | a      | 2      |
    | b      | 2      |
    | c      | 2      |
    | a      | 3      |
    | b      | 3      |
    | c      | 3      |
    +--------+--------+
    (9 rows affected)

    例2

    WHEREを追加するとどうなりますか クロスジョインの条項。

    SELECT * FROM t1 
    CROSS JOIN t2
    WHERE t1.col1 = 'a';

    結果:

    +--------+--------+
    | col1   | col1   |
    |--------+--------|
    | a      | 1      |
    | a      | 2      |
    | a      | 3      |
    +--------+--------+
    (3 rows affected)

    例3

    次のテーブルがあるとします。

    PetTypes テーブル:

    +-------------+-----------+
    | PetTypeId   | PetType   |
    |-------------+-----------|
    | 1           | Bird      |
    | 2           | Cat       |
    | 3           | Dog       |
    | 4           | Rabbit    |
    +-------------+-----------+
    (4 rows affected)

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

    この場合、Pets.PetTypeId columnは、PetTypes.PetTypeIdの外部キーです。 列。

    次に、これら2つのテーブルでクロス結合を実行し、WHEREを使用する例を示します。 条項。

    SELECT 
        p.PetName,
        pt.PetType
    FROM Pets p 
    CROSS JOIN PetTypes pt
    WHERE p.PetTypeId = pt.PetTypeId;

    結果:

    +-----------+-----------+
    | PetName   | PetType   |
    |-----------+-----------|
    | Fluffy    | Cat       |
    | Fetch     | Dog       |
    | Scratch   | Cat       |
    | Wag       | Dog       |
    | Tweet     | Bird      |
    | Fluffy    | Dog       |
    | Bark      | Dog       |
    | Meow      | Cat       |
    +-----------+-----------+
    (8 rows affected)

    WHEREを追加する クロス結合の句は、それを内部結合に変えました。

    WHEREを削除するとどうなりますか 条項。

    SELECT 
        p.PetName,
        pt.PetType
    FROM Pets p 
    CROSS JOIN PetTypes pt;

    結果:

    +-----------+-----------+
    | PetName   | PetType   |
    |-----------+-----------|
    | Fluffy    | Bird      |
    | Fetch     | Bird      |
    | Scratch   | Bird      |
    | Wag       | Bird      |
    | Tweet     | Bird      |
    | Fluffy    | Bird      |
    | Bark      | Bird      |
    | Meow      | Bird      |
    | Fluffy    | Cat       |
    | Fetch     | Cat       |
    | Scratch   | Cat       |
    | Wag       | Cat       |
    | Tweet     | Cat       |
    | Fluffy    | Cat       |
    | Bark      | Cat       |
    | Meow      | Cat       |
    | Fluffy    | Dog       |
    | Fetch     | Dog       |
    | Scratch   | Dog       |
    | Wag       | Dog       |
    | Tweet     | Dog       |
    | Fluffy    | Dog       |
    | Bark      | Dog       |
    | Meow      | Dog       |
    | Fluffy    | Rabbit    |
    | Fetch     | Rabbit    |
    | Scratch   | Rabbit    |
    | Wag       | Rabbit    |
    | Tweet     | Rabbit    |
    | Fluffy    | Rabbit    |
    | Bark      | Rabbit    |
    | Meow      | Rabbit    |
    +-----------+-----------+
    (32 rows affected)

    32行を返すクロス結合を取得します。


    1. Oracleの日付

    2. PostgreSQLで継承されたテーブルを使用するのはいつですか?

    3. テーブルに存在しないINリストの要素に対しても結果を返します

    4. 葯から1つのストアドプロシージャを呼び出して、返されるrefcursorを変更する方法は?