web-dev-qa-db-ja.com

SQLのON句とusing句の違い

Oracleの結合に関連する割り当てを行っています。ある時点で、つまりUSING句とON句の違いは何ですか。

ON句を使用すると、無制限のテーブルを結合できることを知っています。 USING句を使用して無制限のテーブルを結合することは可能ですか?例を使って説明してください。

13
user1252398
  • USING句:名前で結合キーを指定できます。

  • ON句:この構文を使用すると、両方のテーブルで結合キーの列名を指定できます。

USING句

USING句は、複数の列が同じ名前を共有しているが、これらすべての共通列を使用して結合したくない場合に使用されます。 USING句にリストされている列は、WHERE句を含め、ステートメントに修飾子を含めることはできません。

ON句

ON句は、両方のテーブルで列名が一致しないテーブルを結合するために使用されます。結合条件は、WHERE句のフィルター条件から削除されます。

Oracle

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
_
4
Asif Mushtaq

どちらも「無制限」テーブルの結合を許可します。違いは、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);
2
Tony Andrews

USING句:

SELECT * FROM COUNTRIES JOIN CITIES USING (COUNTRY)

上記のクエリは、COUNTRIES.COUNTRYCITIES.COUNTRYと等しいという条件で、COUNTRIESテーブルとCITIESテーブル間の内部結合を実行します。

ON句:

SELECT * FROM COUNTRIES JOIN CITIES ON (COUNTRIES.COUNTRY = CITIES.COUNTRY)

上記のクエリは、on句を使用して内部結合操作を実行します。

0
Aakash Kumar