2012-05-03 37 views
10

Tôi đang thực hiện một số nhiệm vụ liên quan đến các phép nối trong oracle. Trong một số thời điểm tôi bị mắc kẹt, tức là sự khác nhau giữa mệnh đề USING và ON.sự khác biệt giữa Điều khoản ON và điều khoản sử dụng trong sql

Tôi biết rằng việc sử dụng mệnh đề ON chúng tôi có thể tham gia các bảng không giới hạn. Có thể tham gia các bảng không giới hạn sử dụng mệnh đề USING không? bạn có thể giải thích nó bằng cách sử dụng ví dụ.

+1

[Tài liệu là khá tốt] (http://docs.oracle.com/javadb/10.6.2.1/ref/rrefsqljusing.html) –

Trả lời

22
  • Mệnh USING: Điều này cho phép bạn chỉ định khóa kết nối theo tên.

  • Điều khoản ON: Cú pháp này cho phép bạn chỉ định tên cột cho các phím nối trong cả hai bảng.

Các SỬ DỤNG khoản

Mệnh SỬ DỤNG được sử dụng nếu nhiều cột chia sẻ cùng tên nhưng bạn không muốn tham gia sử dụng tất cả các cột chung. Các cột được liệt kê trong mệnh đề SỬ DỤNG không thể có bất kỳ vòng loại trong báo cáo, bao gồm mệnh đề WHERE:

ON khoản

Mệnh đề ON được sử dụng để tham gia bàn nơi cột tên không khớp trong cả hai bảng. Điều kiện tham gia được lấy ra từ các điều kiện lọc trong mệnh đề 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

Cả hai cho phép tham gia các bảng "không giới hạn". Sự khác biệt là SỬ DỤNG đòi hỏi các cột tham gia để có cùng tên:

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

Phiên bản ON làm việc cũng có khi các cột tham gia có tên gọi khác nhau:

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

Ngoài các câu trả lời ở trên, một sự khác biệt quan trọng là mệnh đề ON duy trì các cột từ mỗi bảng được nối một cách riêng biệt, mà mệnh đề USING hợp nhất các cột từ các bảng đã nối vào một cột đơn. Điều này có thể quan trọng nếu, ví dụ, bạn muốn giữ lại các hàng trong tập kết quả của bạn chỉ khi một hàng phù hợp không tồn tại trong một trong các bảng được nối. Để làm điều này bạn sẽ thường sử dụng một OUTER JOIN cùng với một điều kiện trong mệnh đề WHERE, chẳng hạn như

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 

Trong trường hợp này, giả định là TABLE_2.KEY_FIELD là một phần của khóa chính trên TABLE_2, và do đó không bao giờ có thể là NULL nếu dữ liệu thực sự có trong TABLE_2. Nếu, sau khi tham gia ở trên, TABLE_2.KEY_FIELD được tìm thấy chứa NULL trong tập hợp đã nối, điều đó có nghĩa là không có hàng TABLE_2 nào được tìm thấy để khớp với hàng TABLE_1 tương ứng. Điều này đôi khi có thể hữu ích.

Chia sẻ và thưởng thức.

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

Điều khoản USING: Điều này cho phép chỉ định khóa tham gia theo tên.

ON cho phép chỉ định tên cột cho các khóa nối trong cả hai bảng.

+2

Bạn chỉ trả lời một nửa câu hỏi. –

3

Bổ sung vào các câu trả lời ở trên.

using Khoản sẽ in cột được kết hợp chỉ một lần.

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

Select * from A JOIN B using(id);

Output sẽ

id 
1 
2 
3 

Nhưng trong On khoản

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

Output sẽ.

id  id 
1  1 
2  2 
3  3 
0

USING khoản:

SELECT * FROM COUNTRIES JOIN CITIES USING (COUNTRY) 

Các truy vấn trên thực hiện một bên tham gia giữa COUNTRIES bảng và CITIES bảng với điều kiện là COUNTRIES.COUNTRY bằng CITIES.COUNTRY

ON khoản:

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

Truy vấn trên thực hiện thao tác nối bên trong bằng cách sử dụng mệnh đề on.

Các vấn đề liên quan