2011-09-09 6 views
7

参加右外側を使用するために、なぜ我々は同じ結果を得ることができれば私達は...これらの両方の方法でどちらが良いですか?左外部結合か右外部結合か?

Table_1 LEFT OUTER JOIN Table_2 

Table_2 RIGHT OUTER JOIN Table_1 

を同じ結果を得ることができますか?どちらがいいですか ?

+7

'a'と' b'を合計するには、 'a + b'または' b + a'を実行できます。どちらがいいですか? –

+0

私は、現代のRDBMSが、あるものを他のものに変換し、それが問題ではないように優れた性能を持つものを選ぶことができると思います。 –

答えて

13

LEFT OUTER JOINRIGHT OUTER JOINは逆にその引数を除いて、まったく同じ動作をしています。あなたの質問は、a < bまたはb > aと書く方が良いかどうかを尋ねるようなものです。彼らは同じです - それは好みの問題です。

ほとんどの人がLEFT JOINをよく知っていて、SQLで一貫して使用していることがわかりました。突然クエントの途中にRIGHT JOINがあると読んでもそれほど難しいと感じる人もいますし、それが意味することを止めて考える必要があります。だから私は、2つのオプションの間で等しい選択を与え、LEFT JOINを使用することをお勧めしたいと思います。一貫性を持たせることで、他の開発者がSQLを理解しやすくなります。

+3

それは私のコメントよりも良い例です。何らかの理由で、私は対称ではない単純な演算子に空白を描きました:-) –

+4

はい。私はLEFTの好みがおそらく、最も重要なテーブルを持つクエリを書くことを開始する自然な傾向から来ていると思います。多くの場合、完全な情報が含まれています。つまり行がなくなっていません。それ。 –

4

これらは同等ですが、優先度と可読性の問題のみです。私は同じテーブルを想定していますか?

+5

+1と私はちょうど好みを選び、それに固執することを提案する。外部結合に一貫性がある場合、最終結果は同じになります。ほとんどの人がそうしているからといって、未定義の場合は左外部結合を使用することをお勧めします。 – Dane

1

これは、必要に応じて、左テーブルか右テーブルのすべての列が必要かどうかによって異なります。

どちらも同じではありません。

+4

両方のクエリで私たちはTable_1からすべての行を取得します..つまり、同じ結果.. BTWそれは.. "でなければなりません" :) – Vaibhav

2

左外部ジョイン

を左外の結果を参加(または単に参加左)表AおよびBは、常に、「左」テーブル(A)のすべてのレコードを含んでいてもjoin-はの場合条件は "正しい"テーブル(B)に一致するレコードを見つけません。つまり、ON句がB内の0(ゼロ)レコードと一致する場合、結合は結果内の行を返しますが、Bの各列にNULLを返します。これは、左外部結合が、テーブル、を左プラス参加

右外側(NOマッチング結合述部の場合はNULL)右テーブルからの値に一致

参加(または右ジョイン)密接左外部結合外側似て右、を除き、表の処理は逆転されている。"右"テーブル(B)のすべての行が結合テーブルに少なくとも1回表示されます。 "left"テーブル(A)の一致する行が存在しない場合は、Bに一致するレコードがない場合、Aの列にNULLが表示されます。左テーブル(一致する結合述部がない場合はNULL)。他の人がすでに指摘したように

http://en.wikipedia.org/wiki/Join_%28SQL%29

+2

はい、私はOPが尋ねている質問は、A LEFT OUTER JOIN B B右外側のJOIN Aと同じです(*テーブル*はスワップされ、結合方向と同様です)。 –

+0

私はちょうど彼らがどのように動作するかを書いたかったのは、より有用な情報です。 –

+0

ありがとう@ reader_1000私はこの説明の後だった:) – Jen

2

SQL言語の設計者は当然加入の右の優先順位に左強制することは、言語上の不要な制約であろうと感じました(悲しいことに、彼らは列の順序について、同じように感じていなかった!)

ありんようですLEFT OUTERここでStackoverflowのための強い好み、フォークはLEFT(私たちは1つだけhereちょうど昨日持っていた)を使用できるようにするために参加全体を変更する程度に。

実際には、Table_1からすべての行を保持する外部結合が必要であることが分かった前に、クエリTable_2 INNER JOIN Table_1に書かれていたとします。 INNERRIGHT OUTERに変更するのは、結合全体を変更してLEFT OUTERを使用できるようにするよりもずっと簡単です。シンプルはここではうまくいかないため、クエリの意図が誤って変更される危険性が少ないためです。

別の同様の例を使用するには、関係演算子semi joinを考えてください。関係代数の一部であるため、技術はそれがなければ関係的に完全であるとはみなされません。標準SQLは準結合述語MATCHを持っていますが、広く実装されていません。ただし、ほとんどのSQL製品はさまざまな回避策をサポートしています。 Stackoverflowで見られる最も一般的なアプローチは、SELECT句にDISTINCTINNER JOINを使用し、結合されたテーブルから属性を除外しているようです。これに続き、WHERE table_1.ID IN (SELECT ID FROM Table_2)を使用します。次に最も普及しているのはWHERE EXISTS (SELECT * FROM Table_2 WHERE table_1.ID = table_1.ID)です。

上記のすべてが、野生で非常によく見られるセミジョインです。私の個人的な好みはEXISTSです(奇妙なことに、それは関係計算に近いものですが)、私はまだ半結合として他のものを識別できる必要があります。興味深いことに、最も普及しているアプローチ(INNER JOIN + DISTINCT +非投影)は、最も難しいものです。

個人的なスタイルをフィッティングする唯一の目的のためのリファクタリングコードは、不必要な労力のコスト、リスクの増加、ソース管理の意味などを正しく尋ねられます。他人の好みを認識して尊重することの重要なスキルは、自分自身をリファクタリングするだけでそれを理解できるようになると、自分自身を不利な立場に置くでしょう。

言うまでもなく、「正しい」答えは、外部結合を完全に避けることです。リレーショナル・モデルにはnullというものはなく、外部結合はnullを生成するように明示的に設計されています。