LEFT JOINよりRIGHT JOINを好む理由


18

私が正しく理解していれば、すべてRIGHT JOIN

SELECT Persons.*, Orders.*
FROM Orders
RIGHT JOIN Persons ON Orders.PersonID = Persons.ID

次のように表現できますLEFT JOIN

SELECT Persons.*, Orders.*
FROM Persons
LEFT JOIN Orders ON Persons.ID = Orders.PersonID

私の個人的な意見は、声明の意図は次のとおりです。

  • 最初に Persons
  • 次にPersons、必要に応じてを展開/繰り返して、Orders

Persons LEFT JOIN Orders、逆の順序よりもの順序で表されOrders RIGHT JOIN Personsます(RIGHT JOIN結果として私は決して使用しません)。

RIGHT JOINが望ましい状況はありますか?または、できないRIGHT JOINことを実行できるユースケースはありますLEFT JOINか?


12
正しい参加を望んだ1つのケースを思い出せません。パフォーマンス上の理由から、クエリの実行プランが左結合を右結合に反転させた場合がありました。しかし、純粋なコード記述の観点からは、いや、正しい結合を記述したことを覚えていません。
ブランドン

2
これは「コードの説明、作成、デバッグ」に関する質問ではありません。言語に2つの機能があり、それらに実際に違いがある場合、および「非自明」なものが優先される場合は、明らかに同じことを行う2つの機能がある理由を尋ねています。
フィリップケンドール

1
いいえ、ほとんどの場合、左結合は最も簡潔に必要なものをキャプチャし、推論するのが簡単です。私の職場では、実際に右結合を防止するための標準が用意されています。なぜなら、必要な場合はないからです(つまり、反対の左結合にいつでも置き換えることができます)。
mgw854

8
ジョインの違いを理解することはソフトウェア設計に影響するため、この質問はここで話題になります(データベース設計はソフトウェア設計の一部であり、データベースを照会するアルゴリズムも同様です)。また、もデータベース管理者でオン話題もあり、そこにも重複があるかもしれません。
トーマスオーエンズ

1
あなたがそれRIGHT JOINが推奨されているか、より一般的であるかを提案しているかどうかはわかりません。それがあなたの前提である場合、それは間違っています。どちらのコードでも例でも正しい結合が使用されているのを見たことはありません。それのJOINLEFT OUTER JOIN。まれに、が表示される場合がありますFULL OUTER JOIN
ジミージェームズ

回答:


12

それはあなたが満たそうとしている要件に依存します。

:それは言うことと同じではありません「すべての人とそれに対応する注文を欲しがる」ことを「私は彼らの対応者とすべての注文をしたい」あなたが使用しようとしている場合は特に、is null該当する試合で行を持参します。これが、「支配的なテーブル」と呼ばれるものです。これは、結合の反対側に対応する行がない場合でも、行をフェッチしたいテーブルです。

この画像を見ると、同じではないことに気付くでしょう。

ここに画像の説明を入力してください

画像のソースはこの優れた記事です。

ただし、どちらの結合でも、結合内のテーブルの順序を逆にするだけで両方の要件を満たすことができるという点で正しいです。

しかし、左から右に書くことに慣れている西洋人にとっては、右の結合よりも左の結合を使用する方が自然であると思います。結合がed列と同じ方向または同じ順序であるように見えるためselectです。

したがって、正しい結合を好む理由としては、文化ではアラビア語やヘブライ語のように右から左に書くので、そのように考える傾向があります。つまり、おそらく脳のテキスト情報は右から左に流れます。 。

一部の言語学者は、あなたの言語があなたの考え方に影響を与えると考えています:https : //www.edge.org/conversation/lera_boroditsky-how-does-our-language-shape-the-way-we-think


1
私はこれらの線に沿って考え始めましたが、私はそれが正しいとは思わない。ヘブライ語でSQLを書くことを想像し始めました(実際に行ったことはありません)。OK:右揃え、右から左、トップダウン。テーブルAを最初に言及し、次にテーブルBを言及します。右結合では、最初に言及したテーブルのほとんどまたはすべてを(特にヌルの場合)除外します。人間の心は最初主要最も重要なものと結びつく傾向があると思います。これは、書き込み方向に関係なく発生します。それらを「最初の結合」および「2番目の結合」と呼ぶこともできますが、このバイアスは引き続き発生します。
マイクはモニカをサポートします

以下に示す画像へのリンクを含めました。
ジョンレイナー

@Mike私は人々がアラビア語やヘブライ語でSQLを書くことを勧めていません。おそらくあなたの母国語の向きがあなたが正しい結合を好む理由かもしれません。しかし、それは単なる可能性です。左結合の方が自然だと思います。
Tulainsコルドバ

今、私はイメージの作成者に正当なクレジットを与えました。、私は私のHDに年のためにそれを持っていたし、それがどこから来た私は覚えていませんでした
Tulainsコルドバ

私はヘブライ語に堪能であり、私はまだLEFT JOINより自然だと思います。
ゼフスピッツ

3

左結合では実行できない右結合で実行できる(私が知っている)何もありません。ただし、左結合を使用した構文の方がsometimesい場合があります。次のテーブルがあるとしましょう:

Persons
ID | Name

Orders
ID | CustomerId | other unimportant stuff

SpecialOrderDetails
ID | OrderId | other stuff

データベース内のすべての人のリストと、特別な注文の詳細を含む注文のリストを取得する必要があるとします(すべての注文に特別な注文の詳細があるわけではありません)。そのため、通常は人から注文への左結合を行います。しかし、その後、特別な注文の詳細に参加する必要があります。そこで内部結合を使用すると、人から注文への左結合が内部結合に効率的になります。IE:これはあなたがしたいことですが、動作しません(特別な注文を持っていない人は除外されます):

select p.*, o.*, d.*
from Persons p
left join Orders o on o.CustomerId = p.Id
inner join SpecialOrderDetails d on d.OrderId = o.Id

したがって、次のように書き換えることができます。

--get all the people without a special order
select p.*, NULL, NULL, ... --NULLs placeholders for all the fields from OrderDetails and SpecialOrderDetails
from Persons p
left join Orders o on o.CustomerId = p.Id
left join SpecialOrderDetails d on d.OrderId = o.Id
where o.Id is null 

union

--get all the people with a special order
select p.*, o.*, d.*
from Persons p
inner join Orders o on o.CustomerId = p.Id
inner join SpecialOrderDetails d on d.OrderId = o.Id

正確には明確ではありませんが(コメントがないと仮定)、それは仕事をします。これが1回限りのもの(つまり、誰かがいつか戻って保守しなければならないもの)である場合、正しい結合を使用すると、意図が明確になります。

select p.*, o.*, d.*
from Orders o
inner join SpecialOrderDetails d on d.OrderId = o.Id
right join Persons p on p.Id = o.CustomerId

これはもう少し簡潔で明確です(ただし、それを読んでいる人が正しい結合を理解している場合のみ)。これは左結合で記述できますが、ネストされた結合が必要であることに注意してください(右結合よりもおそらく慣れ親しんでいる人は少ないでしょう)。

select p.*, o.*, d.*
from Persons p
left join Orders o 
    inner join SpecialOrderDetails d on d.OrderId = o.Id
on o.CustomerId = p.Id

この時点で、それは最も明確なものとほとんどの人が理解するものの選択です(ネストされた結合と呼ばれていなかった場合、その構文をグーグルする方法を知っていますか?)。

要するに、あなたは厳密に 正しい結合必要ありが、読みやすくするかもしれません。


多分あなたは右利きだと思う。
ロバートハーベイ

この場合、複数の左結合を記述できない理由はわかりませんSELECT p.*, o.*, d.* FROM Persons p LEFT JOIN Orders o ON o.CustomerID = p.ID LEFT JOIN SpecialOrders d ON o.Id = d.OrderID
ゼフスピッツ

@RobertHarvey私はそうですが、利き手がそれと何の関係があるのか​​わかりません。
Becuzz

@ZevSpitz私が書いたものからは明らかではなかったかもしれませんが、特別な注文の詳細レコードが存在する場合にのみ、注文のフィールドのみが欲しいという考えでした。それらのペアが存在する場合にのみ、それらを残します。
Becuzz

-1

レプリケーション/マージの目的でRIGHT JOINが使用されていることがわかりました。2つのテーブルAとBがあるとします。Aは左側に、Bは右側にあります。これらの2つのテーブル間でデータを複製して同等にしたいとします。

AにありBにはないすべてのデータを表示したい場合は、左結合になります。AにないBのすべてのデータを表示したい場合は、右結合になります。

そのため、データをマージおよび複製して将来の見通しを保つために、LEFTおよびRIGHTが役立つ場合があります。

それ以外に、すべてのRIGHT結合はLEFT結合に変換できるため、RIGHT結合を使用する他の理由はないと思います。逆も同様です。そのため、他の場合には好みの問題になります。

SQL結合を視覚化するための便利なリンクを次に示します。

http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins


-1

左結合は右結合の反対ではありません。異なる結果を与える次のケースを確認してください

select * from 
(select 1 as x  where 1=1) a left join 
(select 1 as x  where 1=0) b on a.x=b.x inner join 
(select 1 as x  where 1=1) c on b.x=c.x

select * from 
(select 1 as x where 1=1) c inner join 
(select 1 as x where 1=0) b on c.x=b.x right join 
(select 1 as x where 1=1) a on b.x=a.x

テーブルbとcは常に内側に結合されていますが、最初のaでは他のaと左に結合され、2番目のaでは右に結合されています

左結合は行を返しませんが、右結合は行を返します


これは、より多くの接線のコメントのように読み、見回答する方法
GNAT

-2

そこ好む理由は決してありませんRIGHT JOINし、LEFT JOINより明確です:

SELECT Persons。*、Orders。* FROM Persons LEFT JOIN ON Orders ON Persons.ID = Orders.PersonID

どのテーブルがクエリされているかをすぐに確認できるためです。と一方RIGHT JOIN

SELECT Persons。*、Orders。* FROM Orders RIGHT JOIN Persons ON Orders.PersonID = Persons.ID

最初のテーブルはの後に書き込まれJOINます。

私の経験では、私は見たことがありませんRIGHT JOIN


1
これは質問に何を追加しますか?質問は違い何ですか?; 問題は、なぜ使用する必要RIGHT JOINがあるです。
ZEVスピッツ

@ZevSpitzあなたはどちらを好むのかという理由を尋ねていますが、私はあなたに理由を与えます。それは好みの問題であるため、どのユースケースは重要ではありません。
キリエ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.