私はオラクルの結合に関連するいくつかの割り当てを行っています。ある時点で、私は立ち往生しました。つまり、USING句とON句の違いは何ですか。
ON 句を使用すると、無制限のテーブルに参加できることを知っています。USING句を使用して無制限のテーブルを結合することは可能ですか?どのように? 例を使って説明していただけますか。
句: これにより、USING
結合キーを名前で指定できます。
句:このON
構文では、両方のテーブルの結合キーの列名を指定できます。
USING句
USING 句は、複数の列が同じ名前を共有しているが、これらの共通の列をすべて使用して結合したくない場合に使用されます。USING 句にリストされている列は、WHERE 句を含め、ステートメントに修飾子を含めることはできません。
ON句
ON 句は、列名が両方のテーブルで一致しないテーブルを結合するために使用されます。結合条件は、WHERE 句のフィルター条件から削除されます。
select department_name, city
from departments
JOIN locations
USING (location_id); -- specify the same column name
-- for both of the tables for the join
select department_name, city
from departments dept
join locations loc
on (dept.location_id = loc.id); -- specify different column name
-- for the tables for the join.
上記の回答に加えて、重要な違いは、ON 句が結合された各テーブルの列を個別に保持し、USING 句が結合されたテーブルの列を単一の列にマージすることです。これは、たとえば、結合されたテーブルのいずれにも一致する行が存在しない場合にのみ、結果セットに行を保持する場合に重要です。これを行うには、通常、次のような WHERE 句の条件と共に OUTER JOIN を使用します。
SELECT t1.*
FROM TABLE_1 t1
LEFT OUTER JOIN TABLE_2 t2
ON (t2.KEY_FIELD = t1.KEY_FIELD)
WHERE t2.KEY_FIELD IS NULL
この場合、TABLE_2.KEY_FIELD は TABLE_2 の主キーの一部であるため、データが実際に TABLE_2 に存在する場合は NULL になることはありません。上記の結合の後、TABLE_2.KEY_FIELD が結合セットに NULL を含むことが判明した場合、対応する TABLE_1 行に一致する TABLE_2 行が見つからなかったことを意味します。これが役立つ場合もあります。
共有してお楽しみください。
上記の回答に追加。
using
句は、結合された列を一度だけ出力します。
A.id B.id
1 1
2 2
3 3
Select * from A JOIN B using(id);
出力は
id
1
2
3
しかし、On節では
Select * from A JOIN B on A.id=B.id;
出力となります。
id id
1 1
2 2
3 3
どちらも「無制限」のテーブルの結合を許可します。違いは、USING では結合列が同じ名前である必要があることです。
select emp.ename, dept.dname
from emp join dept using (deptno);
ON バージョンは、結合列の名前が異なる場合にも機能します。
select emp.ename, emp2.ename manager_name
from emp join emp emp2 on (emp.mgr = emp2.empno);
SELECT s.SID, s.SNAME, a.CNAME, c.MAJOR
FROM STUDENT s JOIN COLLEGE c
ON s.SID = c.SID;
SELECT SID, s.SNAME, a.CNAME, a.MAJOR
FROM STUDENT s JOIN COLLEGE c
USING (SID);
USING
句: これにより、結合キーを名前で指定できます。
ON
では、両方のテーブルで結合キーの列名を指定できます。