はい、私はこれら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 JOIN
(CARTESIAN 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は含まれません。