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

INNERJOIN以外の結合を使用した3つのテーブル結合

    はい、私はこれら3つのJOINをすべて使用しますが、LEFT (OUTER) JOINだけを使用する傾向があります。 ■LEFTJOINとRIGHTJOINを混在させる代わりに。 FULL OUTER JOINも使用しています sおよびCROSS JOIN s。

    要約すると、INNER JOIN 結果セットを、JOIN条件を満たすレコードのみに制限します。次の表を検討してください

    編集: テーブル名の名前を変更し、プレフィックスとして@を付けました。 これにより、この回答を読んで実験したい人は誰でもテーブル変数を使用できます。

    ブラウザでこれも試してみたい場合は、これをすべてSQLFiddleで設定しました あまりにも;

    @Table1
    
    id | name
    ---------
    1  | One
    2  | Two
    3  | Three
    4  | Four
    
    @Table2
    
    id | name
    ---------
    1  | Partridge
    2  | Turtle Doves
    3  | French Hens
    5  | Gold Rings
    

    SQLコード

    DECLARE @Table1 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))
    
    INSERT INTO @Table1 VALUES(1, 'One');
    INSERT INTO @Table1 VALUES(2, 'Two');
    INSERT INTO @Table1 VALUES(3, 'Three');
    INSERT INTO @Table1 VALUES(4, 'Four');
    
    DECLARE @Table2 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))
    
    INSERT INTO @Table2 VALUES(1, 'Partridge');
    INSERT INTO @Table2 VALUES(2, 'Turtle Doves');
    INSERT INTO @Table2 VALUES(3, 'French Hens');
    INSERT INTO @Table2 VALUES(5, 'Gold Rings');
    

    INNER JOIN idに結合されたSQLステートメント フィールド

    SELECT 
        t1.id,
        t1.name,
        t2.name
    FROM
        @Table1 t1
    INNER JOIN
        @Table2 t2
        ON 
            t1.id = t2.id
    

    結果は

    id | name | name
    ----------------
    1  | One  | Partridge
    2  | Two  | Turtle Doves
    3  | Three| French Hens
    

    LEFT JOIN 結合の左側にあるテーブルのすべてのレコード(ステートメントを1つのライナーとして書き出す場合は、最初に表示されるテーブル)と、結合の右側にあるテーブルのフィールドを含む結果セットを返します。結合式に一致し、SELECTに含まれている 句。 欠落 詳細にはNULLが入力されます

    SELECT 
        t1.id,
        t1.name,
        t2.name
    FROM
        @Table1 t1
    LEFT JOIN
        @Table2 t2
        ON 
            t1.id = t2.id
    

    結果

    id | name | name
    ----------------
    1  | One  | Partridge
    2  | Two  | Turtle Doves
    3  | Three| French Hens
    4  | Four | NULL
    

    RIGHT JOIN LEFT JOINと同じロジックです ただし、結合式に一致し、SELECTに含まれている、結合の右側からのすべてのレコードと左側からのフィールドを返します。 条項。

    SELECT 
        t1.id,
        t1.name,
        t2.name
    FROM
        @Table1 t1
    RIGHT JOIN
        @Table2 t2
        ON 
            t1.id = t2.id
    

    結果

    id | name | name
    ----------------
    1  | One  | Partridge
    2  | Two  | Turtle Doves
    3  | Three| French Hens
    NULL| NULL| Gold Rings
    

    もちろん、FULL OUTER JOINもあります 、これには、結合された両方のテーブルからのレコードが含まれ、欠落しているが入力されます。 NULLの詳細。

    SELECT 
        t1.id,
        t1.name,
        t2.name
    FROM
        @Table1 t1
    FULL OUTER JOIN
        @Table2 t2
        ON 
            t1.id = t2.id
    

    結果

    id | name | name
    ----------------
    1  | One  | Partridge
    2  | Two  | Turtle Doves
    3  | Three| French Hens
    4  | Four | NULL
    NULL| NULL| Gold Rings
    

    そしてCROSS JOINCARTESIAN PRODUCTとも呼ばれます )、これは単にSELECTのフィールドを相互適用した結果です。 SELECTのフィールドを持つ1つのテーブルからのステートメント 他のテーブルからのステートメント。 CROSS JOINには結合式がないことに注意してください。

    SELECT 
        t1.id,
        t1.name,
        t2.name
    FROM
        @Table1 t1
    CROSS JOIN
        @Table2 t2
    

    結果は

    id | name  | name
    ------------------
    1  | One   | Partridge
    2  | Two   | Partridge
    3  | Three | Partridge
    4  | Four  | Partridge
    1  | One   | Turtle Doves
    2  | Two   | Turtle Doves
    3  | Three | Turtle Doves
    4  | Four  | Turtle Doves
    1  | One   | French Hens
    2  | Two   | French Hens
    3  | Three | French Hens
    4  | Four  | French Hens
    1  | One   | Gold Rings
    2  | Two   | Gold Rings
    3  | Three | Gold Rings
    4  | Four  | Gold Rings
    

    編集:

    Table3があると想像してみてください

    @Table3
    
    id | name
    ---------
    2  | Prime 1
    3  | Prime 2
    5  | Prime 3
    

    SQLコード

    DECLARE @Table3 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))
    
    INSERT INTO @Table3 VALUES(2, 'Prime 1');
    INSERT INTO @Table3 VALUES(3, 'Prime 2');
    INSERT INTO @Table3 VALUES(5, 'Prime 3');
    

    これで、3つのテーブルすべてがINNER JOINSで結合されました。

    SELECT 
        t1.id,
        t1.name,
        t2.name,
        t3.name
    FROM
        @Table1 t1
    INNER JOIN
        @Table2 t2
        ON 
            t1.id = t2.id
    INNER JOIN
        @Table3 t3
        ON 
            t1.id = t3.id
    

    結果

    id | name | name         | name
    -------------------------------
    2  | Two  | Turtle Doves | Prime 1
    3  | Three| French Hens  | Prime 2
    

    ID2と3のレコードが3つのテーブルすべてに共通する唯一のレコードであると考えることでこの結果を理解するのに役立つかもしれません 各テーブルを結合するフィールドでもあります。

    これで、3つすべてにLEFT JOINSが追加されました

    SELECT 
        t1.id,
        t1.name,
        t2.name,
        t3.name
    FROM
        @Table1 t1
    LEFT JOIN
        @Table2 t2
        ON 
            t1.id = t2.id
    LEFT JOIN
        @Table3 t3
        ON 
            t1.id = t3.id
    

    結果

    id | name | name         | name
    -------------------------------
    1  | One  | Partridge    | NULL
    2  | Two  | Turtle Doves | Prime 1
    3  | Three| French Hens  | Prime 2
    4  | Four | NULL         | NULL
    

    Joelの答えは、この結果セットを説明するための良い説明です(Table1はベース/オリジンテーブルです)。

    INNER JOINが追加されました およびLEFT JOIN

    SELECT 
        t1.id,
        t1.name,
        t2.name,
        t3.name
    FROM
        @Table1 t1
    INNER JOIN
        @Table2 t2
        ON 
            t1.id = t2.id
    LEFT JOIN
        @Table3 t3
        ON 
            t1.id = t3.id
    

    結果

    id | name | name         | name
    -------------------------------
    1  | One  | Partridge    | NULL
    2  | Two  | Turtle Doves | Prime 1
    3  | Three| French Hens  | Prime 2
    

    クエリオプティマイザーが操作を実行する順序はわかりませんが、このクエリを上から下に見て、結果セットを理解します。 INNER JOIN Table1とTable2の間のIDで、結果セットは、結合条件によって満たされるレコード、つまり最初の例で見た3つの行のみに制限されます。この一時的な 結果セットはLEFT JOINになります Table1とTablesの間のIDについてTable3に編集されました。表3にはID2と3のレコードがありますが、ID 1はありません。したがって、t3.nameフィールドには2と3の詳細が含まれますが、1は含まれません。



    1. MySQLのCHECK制約が機能していません

    2. Postgres配列にNULLが存在するかどうかを確認します

    3. プロバイダーは、Oracleクライアントのバージョンと互換性がありません

    4. PIVOT、UNPIVOT、およびリバースPIVOTステートメントを理解する