web-dev-qa-db-ja.com

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

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文における左右結合の違いを説明してください。

215
Pankaj Agarwal
Select * from Table1 left join Table2 ...

そして

Select * from Table2 right join Table1 ...

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

71
Péter Török

Codeprojectには、SQL結合の簡単な基本を説明するこのイメージがあります。 http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx SQL joins explained

992
Daan Timmer

あなたがデータを取っているテーブルは '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  
37
vbole
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
12
Moraes

(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つの表の交点を表します。

Inner Join

構文

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で共通に選択されている行をすべて表示します。

Left join

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内の共通の選択された行をすべて表示します。

Right Join

構文:

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

フルジョイン

注:これは和演算と同じです。両方のテーブルから選択されたすべての値を返します。

Full join

構文:

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結合の場合、順序は重要です

w3schoolsでさらに検索する

10

RIGHT OUTER JOIN構文を使ってLEFT OUTER JOINを書き換えることができるのであれば、どうしてRIGHT OUTER JOIN構文があるのでしょうか」と尋ねているようです。この質問に対する答えは、その言語の設計者はそのような制限をユーザに課したくない(そしてそうしたなら彼らは批判されたであろう)ので、ユーザがテーブルの順序を変更することを強いるので単に結合タイプを変更するときに、状況によってはFROM節に含まれます。

10
onedaywhen

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

直感的に思えるのでほとんどの人がLEFT JOINを使うだけです、そしてそれは普遍的な構文です - 私はすべてのRDBMSがRIGHT JOINをサポートするとは思わない。

8
JNK

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のすべての結果が得られます。

0
vinsinraw

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に右結合します

0
Nisarg Shah

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は両方のテーブルで共通しており、結果として、idnameの列を持つ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からのすべての列が考慮されます。

0
user5837472