236

SQLServerでの結合について知っています。

例えば。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ステートメントで左結合と右結合の違いを説明してください。

4

9 に答える 9

77
Select * from Table1 left join Table2 ...

Select * from Table2 right join Table1 ...

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

于 2011-01-17T16:59:08.060 に答える
44

データを取得しているテーブルは「LEFT」です。
参加しているテーブルは「右」です。
LEFT 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  
于 2013-10-22T13:39:04.423 に答える
40

(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

いくつかの事実

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

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

w3schoolsで詳細を見る

于 2017-11-13T09:47:18.763 に答える
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
于 2013-05-13T14:49:58.640 に答える
11

RIGHT OUTER JOIN「使用する構文を書き直すことができるのならLEFT OUTER JOIN、なぜRIGHT OUTER JOIN構文があるのか​​」と質問しているようです。この質問に対する答えは、言語の設計者がユーザーにそのような制限を課したくなかったため(そして、そうすると批判されたと思います)、ユーザーにテーブルの順序を変更せざるを得なかったためだと思います。FROM単に結合タイプを変更する場合の状況によっては、句で。

于 2011-01-18T11:06:46.617 に答える
9

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

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

于 2011-01-17T16:57:36.180 に答える
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

于 2016-06-21T22:24:23.713 に答える
0

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

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

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

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

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

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

最初の左結合クエリでテーブル1とテーブル2をそれぞれ左と右宣言し、 2番目の右結合クエリでテーブル1とテーブル2それぞれに宣言するように、クエリでのテーブル宣言の順序が異なるため、両方のクエリで同じ結果が得られます。クエリ。

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

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

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

于 2017-10-17T10:44:57.093 に答える
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と2は両方のテーブルで共通であり、その結果、1番目2番目のテーブルのid列とname列を持つ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と列からすべてのレコード(行)を取得し、テーブル1とテーブル2から一致するIDをテーブル2から取得します(これは右結合であるため、テーブル2からのすべての列ではなく表1からが考慮されます)。

于 2018-02-14T18:54:39.090 に答える