0

2 つのテーブルがあります ( http://sqlfiddle.com/#!3/6d04f/20を参照してください)

次の違いを視覚化するのに苦労しています。

select *
from TableA as a right outer join tableB as b on b.city1id = a.id

select *
from TableA as a right outer join tableB as b on b.city1id = a.id
left outer join tableB parent on parent.city2id = b.city1id

TableA と TableB の間で右外部結合がダウンし、その結果が再び TableB との左外部結合になります。

両方のクエリを実行した結果は同じであるため、この場合に左外部結合がどのような影響を与えるかはわかりません。

概念的には、ここで何が違うのかわかりません。

4

2 に答える 2

1

わかりました、私がそれを書いたので説明します。

クエリ 2

 select *
    from TableA as a right outer join tableB as b on b.city1id = a.id
    left outer join tableB parent on parent.city2id = b.city1id

このクエリを次のように書き換えることができます

select *
from Tableb as b left outer join tablea as a on b.city1id = a.id
left  outer join tableb parent on parent.city2id = b.city1id

tableB と table A の間の最初の左外部結合がこれを行います

TableB( get all records ) and tableA matching records = call this result set as T

T と tableb の間の 2 番目の左外部結合がこれを行います

T ( get all records ) and tableb matching records

ここを参照

クエリ 1

select *
from TableA as a right outer join tableB as b on b.city1id = a.id

このように書くことができます

select *
from Tableb as b left outer join tablea as a on b.city1id = a.id

これを行うだけです

tableB と table A の間の最初の左外部結合 (前のクエリで説明されています)

 TableB( get all records ) and tableA matching records 
于 2013-04-28T21:42:48.223 に答える
0

ここでの本当の質問は次のとおりです。あなたの目標は何ですか。外部結合とは、単純に、言及された側 (左または右) がレコードの取得元であり、反対側が一致するレコードを取得するか、そのような一致が見つからない場合は null であることを意味します。

があるのでA right B left (B as parent)、両方の結合が からレコードを取得しB、テーブルAは必要に応じて一致または null のみを取得します。したがって、コアクエリはすべて tableBであり、一致すると tableが取り込まれ、一致が見つかったときにA最後に取り込まれます。B as parent

Bしたがって、2 つのクエリは、応答のコアとしてテーブルをプルし、テーブルBは返される行数 (B のすべての行) を制御します。あなたのフィドルでは、それは7行です。

(外部結合が主テーブルよりも多くの行を返す可能性があります (オプション側の複数のレコードが 1 つの必須側レコードに一致するため) が、必須テーブルより少なくなることはありません)。

于 2013-04-28T21:10:12.330 に答える