ウィキペディアは次のように述べています。
「実際には、明示的な右外部結合はめったに使用されません。これは、常に左外部結合に置き換えることができ、追加機能を提供しないためです。」
RIGHT表記を使用することを好む状況を誰かが提供できますか?その理由は? 使う理由が思いつかない。私にとって、それは物事をより明確にすることはありません。
編集: 私はオラクルのベテランであり、(+) 構文から離れることを新年の抱負にしています。ちゃんとやりたい
ウィキペディアは次のように述べています。
「実際には、明示的な右外部結合はめったに使用されません。これは、常に左外部結合に置き換えることができ、追加機能を提供しないためです。」
RIGHT表記を使用することを好む状況を誰かが提供できますか?その理由は? 使う理由が思いつかない。私にとって、それは物事をより明確にすることはありません。
編集: 私はオラクルのベテランであり、(+) 構文から離れることを新年の抱負にしています。ちゃんとやりたい
RIGHT OUTER JOIN を使用する唯一の理由は、SQL をより自己文書化することです。
1 対多のリレーションシップの従属 (多) 側に null 行があるクエリには左結合を使用し、独立側に null 行を生成するクエリには右結合を使用することができます。
これは、生成されたコードで、またはショップのコーディング要件が FROM 句でテーブルの宣言の順序を指定している場合にも発生する可能性があります。
今まで使ったことがなくright join
、実際に必要になるとは思っていませんでした。少し不自然に思えます。しかし、私が考えた後、多くのテーブルの交差で1つのテーブルを外部結合する必要がある場合、これは非常に役立つ可能性があるため、次のようなテーブルがあります。
そして、次のような結果を得たい:
または、SQL (MS SQL Server) の場合:
declare @temp_a table (id int)
declare @temp_b table (id int)
declare @temp_c table (id int)
declare @temp_d table (id int)
insert into @temp_a
select 1 union all
select 2 union all
select 3 union all
select 4
insert into @temp_b
select 2 union all
select 3 union all
select 5
insert into @temp_c
select 1 union all
select 2 union all
select 4
insert into @temp_d
select id from @temp_a
union
select id from @temp_b
union
select id from @temp_c
select *
from @temp_a as a
inner join @temp_b as b on b.id = a.id
inner join @temp_c as c on c.id = a.id
right outer join @temp_d as d on d.id = a.id
id id id id
----------- ----------- ----------- -----------
NULL NULL NULL 1
2 2 2 2
NULL NULL NULL 3
NULL NULL NULL 4
NULL NULL NULL 5
したがって、 に切り替えるとleft join
、結果は同じではなくなります。
select *
from @temp_d as d
left outer join @temp_a as a on a.id = d.id
left outer join @temp_b as b on b.id = d.id
left outer join @temp_c as c on c.id = d.id
id id id id
----------- ----------- ----------- -----------
1 1 NULL 1
2 2 2 2
3 3 3 NULL
4 4 NULL 4
5 NULL 5 NULL
適切な結合なしでこれを行う唯一の方法は、共通テーブル式またはサブクエリを使用することです
select *
from @temp_d as d
left outer join (
select *
from @temp_a as a
inner join @temp_b as b on b.id = a.id
inner join @temp_c as c on c.id = a.id
) as q on ...
右外部結合について考えるのは、完全結合を修正している場合だけであり、たまたま右側のテーブルのすべてのレコードを結果に含める必要がありました。しかし、私が怠け者であっても、おそらくイライラして、左結合を使用するように再配置するでしょう。
ウィキペディアのこの例は、私が何を意味するかを示しています。
SELECT *
FROM employee
FULL OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID
単語FULL
を置き換えるだけで、句RIGHT
の順序を入れ替えなくても、新しいクエリが作成されます。ON
適切な結合についてあまり考える必要はありませんでしたが、20 年近く SQL クエリを書いてきたので、結合を使用する正当な理由に出くわしたことはないと思います。私は確かに、開発者が組み込みのクエリ ビルダーを使用した場所から発生したと思われるそれらの多くを見てきました。
クエリに遭遇したときはいつでも、それを排除するためにクエリを書き直しました.しばらくクエリにアクセスしていない場合、学習または再学習するには追加の精神的エネルギーが必要すぎることがわかりました。クエリの意図が失われたり、誤った結果が返されたりすることはめったにありません。クエリが機能しない理由を確認するよう私に依頼するのは、通常、この誤りのためです。
考えてみると、右結合を導入すると、途中で満たす必要があるロジックの競合するブランチと私が考えるものがあります。追加の要件/条件が導入された場合、これらのブランチの両方がさらに拡張される可能性があり、1 つのブランチが誤った結果を引き起こさないようにするために調整しなければならない複雑さが増します。
さらに、一度右結合を導入すると、後でクエリに取り組む他の経験の浅い開発者は、クエリの右結合部分に追加のテーブルを単純に追加する可能性があります。そうすることで、まだ満たす必要がある競合するロジック フローが拡張されます。真ん中; または、私が見たいくつかのケースでは、元のロジックに触れたくないため、ビューのネストを開始します。これは、ロジックを駆動したクエリまたはビジネス ルールを理解していない可能性があるためです。
SELECT * FROM table_a
INNER JOIN table_b ON ....
RIGHT JOIN table_c ON ....
table_c のすべての行が常に選択されていることを確認しながら、最初の 2 つのテーブルをすばやく簡単に内部結合し、table_c と結合するにはどうすればよいでしょうか?
SQL ステートメントは、正確であることに加えて、できるだけ読みやすく、表現的に簡潔にする必要があります (SQL ステートメントは 1 つのアトミック アクションを表し、意図しない結果を避けるために完全に理解する必要があるためです)。右外部結合。
ただし、常に一方を他方に変換することができ、オプティマイザーは一方を他方と同様に処理します。
かなり長い間、主要な rdbms 製品の少なくとも 1 つが LEFT OUTER JOIN のみをサポートしていました。(MySQLだったと思います。)