2012-05-03 70 views
10

Wykonuję niektóre zadania związane z połączeniami w Oracle. W pewnym momencie utknąłem, tj. Jaka jest różnica między klauzulą ​​USING a ON.Różnica między klauzulą ​​ON i klauzulą ​​uzytkowania w sql

Wiem, że używając klauzuli ON jesteśmy w stanie dołączyć do nieograniczonej liczby tabel. Czy można dołączać do tabel bez ograniczeń przy użyciu klauzuli USING? możesz wyjaśnić to za pomocą przykładu.

+1

[Dokumentacja jest całkiem dobra] (http://docs.oracle.com/javadb/10.6.2.1/ref/rrefsqljusing.html) –

Odpowiedz

22
  • Klauzula USING: Umożliwia określenie klucza łączenia według nazwy.

  • Klauzula ON: Ta składnia umożliwia określenie nazw kolumn dla kluczy łączenia w obu tabelach.

Using klauzula

Klauzula USING jest używany, gdy kilka kolumn mają takie same nazwy, ale nie chcesz dołączyć do korzystania z tych wszystkich wspólnych kolumnach. Kolumny wymienione w klauzuli USING nie może mieć żadnych kwalifikatorów w rachunku, w tym klauzuli gdzie:

Klauzula ON

Klauzula ON służy do łączenia tabel, gdzie kolumna nazwy nie są zgodne w obu tabelach. Warunki łączą są usuwane z warunków filtracyjnych w klauzuli 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 (d.location_id = l.id); -- specify different column name 
          -- for the tables for the join. 
2

Oba umożliwiają łączenie „nieograniczony” tabel. Różnica polega na tym, że używanie wymaga kolumny łączą się mieć tę samą nazwę:

select emp.ename, dept.dname 
from emp join dept using (deptno); 

Wersja ON działa także wtedy, gdy kolumny dołączyć mają różne nazwy:

select emp.ename, emp2.ename manager_name 
from emp join emp emp2 on (emp.mgr = emp2.empno); 
9

oprócz powyższych odpowiedzi, co stanowi ważną różnicą jest to, że klauzula ON zachowuje kolumny z każdej złączonej tabeli osobno, co klauzula USING scala kolumny z połączonych tabel w jedną kolumnę. Może to być ważne, jeśli na przykład chcesz zachować wiersze w zestawie wyników tylko wtedy, gdy pasujący wiersz nie istnieje w jednej z połączonych tabel. Aby to zrobić, że zazwyczaj użyć sprzężenia zewnętrznego wraz z warunku w klauzuli WHERE, takich jak

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 

W tym przypadku zakłada się, że TABLE_2.KEY_FIELD jest częścią klucza podstawowego TABLE_2 i w ten sposób nigdy nie może być NULL, jeśli dane są rzeczywiście obecne w TABLE_2. Jeśli po powyższym sprzężeniu okaże się, że TABLE_2.KEY_FIELD zawiera NULL w połączonym zestawie, oznacza to, że nie znaleziono wiersza TABLE_2 odpowiadającego wierszowi TABLE_1. Czasami może się przydać.

Udostępnij i ciesz się.

-2
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); 

Klauzula USING: Umożliwia to określenie klucza łączenia według nazwy.

Opcja ON pozwala na określenie nazw kolumn dla kluczy łączenia w obu tabelach.

+2

Odpowiadasz tylko na połowę pytania. –

3

Oprócz powyższych odpowiedzi.

using Klauzula spowoduje wydrukowanie połączonej kolumny tylko jeden raz.

A.id B.id 
1  1 
2  2 
3  3 

Select * from A JOIN B using(id);

wyjściowa będzie

id 
1 
2 
3 

Ale w dniu klauzuli

Select * from A JOIN B on A.id=B.id;

wyjście będzie.

id  id 
1  1 
2  2 
3  3 
0

USING formuły:

SELECT * FROM COUNTRIES JOIN CITIES USING (COUNTRY) 

Powyższe zapytanie przeprowadza wewnętrzne połączenie pomiędzy stołem COUNTRIES a stołem CITIES pod warunkiem, że COUNTRIES.COUNTRY wynosi CITIES.COUNTRY

ON formuły:

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

Powyższe zapytanie wykonuje operację łączenia wewnętrznego za pomocą klauzuli on.

Powiązane problemy