SQL Serverの結合について知っています。
例えば。 Table1、Table2の2つのテーブルがあります。
それらのテーブル構造は以下の通りです。
create table Table1 (id int, Name varchar (10))
create table Table2 (id int, Name varchar (10))
Table1のデータは次のとおりです。
Id Name
-------------
1 A
2 B
Table2のデータは次のとおりです。
Id Name
-------------
1 A
2 B
3 C
下記の両方のSQL文を実行すると、両方の出力は同じになります。
select *
from Table1
left join Table2 on Table1.id = Table2.id
select *
from Table2
right join Table1 on Table1.id = Table2.id
上記のSQL文における左右結合の違いを説明してください。
Select * from Table1 left join Table2 ...
そして
Select * from Table2 right join Table1 ...
確かに完全に交換可能です。違いを確認するには、Table2 left join Table1
(またはそれと同じペアのTable1 right join Table2
)を試してください。 Table2にはTable1には存在しないIDを持つ行が含まれているため、このクエリではさらに多くの行が表示されます。
Codeprojectには、SQL結合の簡単な基本を説明するこのイメージがあります。 http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx
あなたがデータを取っているテーブルは 'LEFT'です。
あなたが参加しているテーブルは 'RIGHT'です。
左結合:左側の表からすべての項目を取り出し、右側の表から一致する項目のみを取り出します。
RIGHT JOIN:右側のテーブルからすべてのアイテムを取り出し、左側のテーブルから一致するアイテムのみを取り出します。
そう:
Select * from Table1 left join Table2 on Table1.id = Table2.id
を与えます:
Id Name
-------------
1 A
2 B
しかし:
Select * from Table1 right join Table2 on Table1.id = Table2.id
を与えます:
Id Name
-------------
1 A
2 B
3 C
より多くの行を持つテーブル上で、より少ない行を持つテーブルを正しく結合していました
そして
再度、行数の多い表の上に行数の少ない表を結合したままにしました
If Table1.Rows.Count > Table2.Rows.Count Then
' Left Join
Else
' Right Join
End If
select fields
from tableA --left
left join tableB --right
on tableA.key = tableB.key
この例のfrom
内の表tableA
は、リレーションの左側にあります。
tableA <- tableB
[left]------[right]
そのため、右側のテーブル(tableA
)に一致するものがなくても、左側のテーブル(tableB
)からすべての行を取得したい場合は、「左結合」を使用します。
また、左側のテーブル(tableB
)に一致するものがなくても、右側のテーブル(tableA
)からすべての行を取得する場合は、right join
を使用します。
したがって、次のクエリは上記で使用したものと同じです。
select fields
from tableB
right join tableA on tableB.key = tableA.key
(INNER)JOIN:両方のテーブルで一致する値を持つレコードを返します。
LEFT(OUTER)JOIN:左側のテーブルからすべてのレコードを返し、右側のテーブルから一致したレコードを返します。
RIGHT(OUTER)JOIN:右側のテーブルからすべてのレコードを、左側のテーブルから一致したレコードを返します。
FULL(OUTER)JOIN:左テーブルまたは右テーブルに一致するものがある場合は、すべてのレコードを返します。
たとえば、次のレコードを含む2つのテーブルがあるとします。
表A
id firstname lastname
___________________________
1 Ram Thapa
2 sam Koirala
3 abc xyz
6 sruthy abc
表B
id2 place
_____________
1 Nepal
2 USA
3 Lumbini
5 Kathmandu
内部結合
注:これは2つの表の交点を表します。
構文
SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
サンプル表に適用してください。
SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;
結果は次のようになります。
firstName lastName Place
_____________________________________
Ram Thapa Nepal
sam Koirala USA
abc xyz Lumbini
左結合
注:TableAで選択されているすべての行と、TableBで共通に選択されている行をすべて表示します。
SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;
サンプルテーブルに適用してください
SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;
結果は次のようになります。
firstName lastName Place
______________________________
Ram Thapa Nepal
sam Koirala USA
abc xyz Lumbini
sruthy abc Null
右結合
注:TableB内の選択されたすべての行と、TableA内の共通の選択された行をすべて表示します。
構文:
SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;
あなたのsamoleテーブルにそれを適用します。
SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;
結果はbwになります:
firstName lastName Place
______________________________
Ram Thapa Nepal
sam Koirala USA
abc xyz Lumbini
Null Null Kathmandu
フルジョイン
注:これは和演算と同じです。両方のテーブルから選択されたすべての値を返します。
構文:
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
あなたのサンプにそれを適用します。
SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;
結果は次のようになります。
firstName lastName Place
______________________________
Ram Thapa Nepal
sam Koirala USA
abc xyz Lumbini
sruthy abc Null
Null Null Kathmandu
いくつかの事実
内部結合の場合、順序は関係ありません
(LEFT、RIGHTまたはFULL)OUTER結合の場合、順序は重要です
「RIGHT OUTER JOIN
構文を使ってLEFT OUTER JOIN
を書き換えることができるのであれば、どうしてRIGHT OUTER JOIN
構文があるのでしょうか」と尋ねているようです。この質問に対する答えは、その言語の設計者はそのような制限をユーザに課したくない(そしてそうしたなら彼らは批判されたであろう)ので、ユーザがテーブルの順序を変更することを強いるので単に結合タイプを変更するときに、状況によってはFROM
節に含まれます。
あなたの2つのステートメントは同等です。
直感的に思えるのでほとんどの人がLEFT JOIN
を使うだけです、そしてそれは普遍的な構文です - 私はすべてのRDBMSがRIGHT JOIN
をサポートするとは思わない。
Outer Excluding JOIN
の望ましい結果が得られるように、A Union B Minus A Interaction B
の最後の図のAND
節にwhere
条件が必要になるかもしれないと思います。クエリをに更新する必要があると思います
SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL AND B.Key IS NULL
OR
を使用すると、A Union B
のすべての結果が得られます。
select * Table1からTable1.id = Table2.idでTable2を左結合します
最初のクエリでは左結合はleft-sidedテーブルtable1torightd-sidedtabletable2。
table1のすべてのプロパティが表示されますが、table2では条件が真になるプロパティのみが表示されます。
select * Table2からTable1.idのTable1に右結合Table1.id = Table2.id
最初のクエリでは右結合は比較rightd-sidedテーブルtable1からleft-sidedtabletable2。
table1のすべてのプロパティが表示されますが、table2では条件が真になるプロパティのみが表示されます。
両方のクエリは、クエリでのテーブル宣言の順序が異なるため、同じ結果を返しますtable1andtable2inleft and rightそれぞれfirst left joinクエリで、またtable1およびtable2inrightおよびleftin 2番目の右joinクエリ。
これが、両方のクエリで同じ結果が得られる理由です。異なる結果が必要な場合は、この2つのクエリをそれぞれ実行します。
select * Table1からTable1.id = Table2.idでTable2を左結合します
select * Table1からTable1.id = Table2.idのTable2に右結合します
Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id
定義上:左結合は、表1の "select"キーワードで言及されたすべての列と、 "on"キーワードの後の基準に一致する表2の列を選択します。
同様に、定義上、Right Joinは、表2の "select"キーワードで言及されたすべての列と、 "on"キーワードの後の基準に一致する表1の列を選択します。
あなたの質問を参照して、両方のテーブルの中のidは、出力で投げられる必要があるすべての列と比較されます。したがって、ID 1とID 2は両方のテーブルで共通しており、結果として、idとnameの列を持つ4つの列があります。 1番目および2番目のテーブルから順番に。
*select * from Table1 left join Table2 on Table1.id = Table2.id
上記の式では、テーブル1からのすべてのレコード(行)と、テーブル2からのテーブル1とテーブル2からのidが一致しています。
select * from Table2 right join Table1 on Table1.id = Table2.id**
上記の式と同様に、テーブル1とテーブル2からのidと一致する、テーブル1と列からのすべてのレコード(行)を取得します。右結合なので、table1からではなくtable2からのすべての列が考慮されます。