SQL Serverでの左結合と右結合の違い


225

SQL Serverの結合について知っています。

例えば。Table1、Table2の2つのテーブルがあります。

それらのテーブル構造は次のとおりです。

create table Table1 (id int, Name varchar (10))

create table Table2 (id int, Name varchar (10))

次の表1のデータ:

    Id     Name     
    -------------
    1      A        
    2      B    

次の表2のデータ:

    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文の左結合と右結合の違いを教えてください。

回答:


73
Select * from Table1 left join Table2 ...

そして

Select * from Table2 right join Table1 ...

確かに完全に交換可能です。ただし、違いを確認するにはTable2 left join Table1(またはその同じペアTable1 right join Table2)を試してください。Table2には、Table1には存在しないIDを持つ行が含まれているため、このクエリはより多くの行を提供するはずです。


17
では、必要RIGHT JOINな結果を単に達成できるのであれば、なぜ必要なのLEFT JOINでしょうか。:P
user1857492

1
@SilapAliyevそれは実際には非常に良い質問です。誰でも答えられますか?:D
Ian Chu Te

21
Select * from Table1 left join Table 2表1のSelect * from Table1 right join Table 2すべてのレコードと表2の一致するレコードを返します。逆の場合は、表2のすべてのレコードと表1の一致するレコードを返します。
Programda Adagal

3
あなたはもっとして2つのテーブルを使用する場合は、右の結合を使用することは有意義で読み取ることができます
ouɐɯʞɔıɥʇɹɐʞ

1
@MarkusMeskanen 7ワードの単純な文を変更します。複数のサブセンテンスがある356行の文があり、Left Rightのロジックを変更する必要がある場合、1つの単語だけで変更すると不思議に思います...
Programador Adagal

1014

Codeprojectには、SQL結合の単純な基本を説明する次の画像があります。http//www.codeproject.com/KB/database/Visual_SQL_Joins.aspx SQL結合の説明


64
そこにはあまり「詳細」はありません。クレジットは実際には私ではなくcodeprojectページに移動する必要があります。しかし、私はもちろん注意を気にしません:-)
Daan Timmer 2013年

6
@Daan Timmerいいえ、あなたにもクレジットが必要です!特定の特定の需要を満たすために、再パッケージして再販します。小売業者も同じことを行い、数十億ドルを獲得
BKSpurgeon 2015年

「JOINを除く外」の最後の図のwhere句で「AND」条件が必要になる場合があるように感じます。クエリを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に更新する必要があると感じています
vinsinraw

@vinsinraw不要です。これはすでに条件でカバーされているためですJOIN Table_B b ON A.Key = B.Key。OR条件は正常に機能します。
Daan Timmer

これはベン図の一般的な乱用です。円AとBはテーブルAとBを表していない、円Aは左結合Bであり、円Bは右結合Bである。また、ON条件が何であるかは関係ありません。場合。このページこのセクションのRe Venn図の私のコメントと回答参照してください。
philipxy

37

データを取得するテーブルは「LEFT」です。
参加しているテーブルは「右」です。
左結合:左のテーブルからすべてのアイテムを取り、かつ右のテーブルから(のみ)一致するアイテムを取り出します。
右の結合:右のテーブルのすべてのアイテムと、左のテーブルの(のみ)一致するアイテムを取得します。
そう:

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  

22

(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;

あなたのサモレのテーブルにそれを適用してください:

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

いくつかの事実

INNER参加の場合、順序は関係ありません

(LEFT、RIGHT、またはFULL)OUTER結合の場合、順序は重要です

w3schoolsで詳細を見る


12
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

10

RIGHT OUTER JOINusing LEFT OUTER JOIN構文を書き換えることができるのに、なぜRIGHT OUTER JOIN構文があるのか」と質問しているようです。この質問に対する答えは、言語の設計者がユーザーにそのような制限を課すことを望まなかった(そして、そうした場合、彼らは批判されたはずだと思う)ためだと思います。FROM結合の種類を変更するだけの場合、句の中で。


時々、左と右の外部結合は完全に交換可能です、正しいですか?
アレックス

4
@Alex:実際、左外部結合と右外部結合は常に交換可能です。
1

8

2つのステートメントは同等です。

ほとんどの人はLEFT JOINそれがより直感的であり、普遍的な構文であるため、使用するだけです-私はすべてのRDBMSをサポートしてRIGHT JOINいるとは思いません。


「すべてのRDBMSがRIGHT JOINをサポートしているとは思いません」-すべてのRDBMSがSQLをサポートしているわけではありません。ただし、一部のSQL製品がサポートしているLEFTがそうでないことを示唆している場合は、どの製品をサポートしているかRIGHTを示してください。
1

10
例えば@onedaywhen、SQLiteの3が実装されていないRIGHTFULL OUTER JOIN sqlite.org/omitted.html
Mac_Cain13

0

の望ましい結果を得るには、最後の図の節のAND条件が必要になる場合があると思います。クエリを更新する必要があると思いますwhereOuter Excluding JOINA Union B Minus A Interaction B

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


0

Table1から*を選択し、Table1.id = Table2.idでTable2を結合します。

最初のクエリでは、左結合は左側のテーブルtable1右側のテーブルtable2と比較します。

table1のすべてのプロパティが表示されるのに対し、table2では条件がtrueになるプロパティのみが表示されます。

Table2から*を選択し、Table1.id = Table2.idのTable1右結合

最初のクエリで、右結合は右側のテーブルtable1左側のテーブルtable2と比較します。

table1のすべてのプロパティが表示されるのに対し、table2では条件がtrueになるプロパティのみが表示されます。

クエリ内のテーブルの宣言の順序が異なるため、両方のクエリは、同じ結果が得られます宣言するようTABLE1table2のを左右それぞれにおける最初の左の参加のクエリを、とも宣言TABLE1table2の中に右を左にそれぞれ参加する第2の右クエリ。

これが、両方のクエリで同じ結果が得られる理由です。したがって、異なる結果が必要な場合は、この2つのクエリをそれぞれ実行します。

Table1から*を選択し、Table1.id = Table2.idでTable2を結合します。

Table1から*を選択し、Table1.id = Table2.idでTable2を結合します。


0

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id 定義により、左結合は、表1の「select」キーワードで言及されたすべての列と、「on」キーワードの後の基準に一致する表2の列を選択します。

同様に、定義によって:右結合は、表2の「select」キーワードで言及されたすべての列と、「on」キーワードの後の基準に一致する表1の列を選択します。

あなたの質問を参照すると、両方のテーブルのidは、出力でスローする必要があるすべての列と比較されます。したがって、ID 1とID 2は両方のテーブルで共通であり、結果として、最初のテーブルと2番目のテーブルのIDおよび名前の列を持つ4つの列が順番に表示されます。

*select * from Table1 left join Table2 on Table1.id = Table2.id

上記の式は、テーブル1と列からすべてのレコード(行)を取得し、テーブル1とテーブル2から一致するIDをテーブル2から取得します。

select * from Table2 right join Table1 on Table1.id = Table2.id**

同様に、上記の式から、テーブル1と列からすべてのレコード(行)を取得し、一致するIDをテーブル1とテーブル2から取得します。これはテーブル2からの正しい結合であるため、table2 table1から考慮されます)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.