あなたはおそらくすでに違いを認識していますが、ドキュメントから:
ON condition句を使用してON
、結合条件を指定します。WHERE
これにより、句内の検索条件またはフィルタ条件とは別に結合条件を指定できます。
USING ( column )両方のテーブルで同じ名前を持つ列の等結合を指定する場合、USING column
句は使用する列を示します。この句を使用できるのは、両方のテーブルの結合列が同じ名前の場合のみです。この句内では、列名を表名または表の別名で修飾しないでください。
したがって、これらは同等になります。
select e.ename, d.dname
from emp e join dept d using (deptno);
select e.ename, d.dname
from emp e join dept d on d.deptno = e.deptno;
どちらを使用するかはスタイルの問題ですが、(少なくとも) を使用できない状況が 2 つありますusing
。(a) 2 つのテーブルで列名が同じでない場合、および (b)結合列を使用したい場合:
select e.ename, d.dname, d.deptno
from emp e join dept d using(deptno);
select e.ename, d.dname, d.deptno
*
ERROR at line 1:
ORA-25154: column part of USING clause cannot have qualifier
select ..., deptno
もちろん、それを使用して結合されていない同じ列を持つ別のテーブルがない限り、修飾子 and をそのままにしておくことができます:
select e.ename, d.dname, deptno
from emp e join dept d using (deptno) join mytab m using (empno);
select e.ename, d.dname, deptno
*
ERROR at line 1:
ORA-00918: column ambiguously defined
その場合、修飾されたのみm.deptno
を選択できます。(OK、これはかなり不自然です...)。
回避する主な理由using
は、一貫性です。使えないこともあるので、on
そのような状況で時々切り替えるのは少し耳障りかもしれません. しかし、それは深い技術的な理由よりもスタイルに関するものです。
おそらく、あなたの同僚は単にコーディング標準を課す (または提案する) だけですが、それを知っているのは同僚だけです。また、レビュー中の新しいコードを変更するよう求められているのか、それとも古いコードを変更するよう求められているのかも明確ではありません。後者の場合、彼らが好む理由に関係なく、on
変更されたコードが再テストされた場合でも新しい問題が発生するリスクがあるため、証明されたコードを変更するための別の正当化を取得する必要があると思います-コストは別として/やり直しと再テストに伴う労力。
ただし、あなたの質問についていくつかのことが気になります。最初に、on
構文を「昔ながら」と説明していますが、それは公平ではないと思います-両方とも有効で最新です(SQL:2011の時点では、私は思うが、引用が必要です!)。この:
不要な重複列がない、より簡潔な結果セットを生成します。
...これは、 を使用していることを示唆していると思います。select *
それ以外の場合は、修飾子にいくつかの余分な文字がありますが、値の1つを選択するだけです。アドホッククエリと一部のサブクエリ以外では、使用select *
は一般的に悪い習慣と見なされます (ここでは例を示します)。