Tôi không sử dụng cú pháp USING, vì
- hầu hết các liên kết của tôi không phù hợp với nó (không phải cùng một tên trường đang được khớp và / hoặc nhiều kết hợp trùng khớp trong liên kết) và
- không rõ ràng ngay lập tức nó chuyển sang nghĩa là gì trong trường hợp có nhiều hơn hai bảng
tức là giả sử 3 bảng có cột 'id' và 'id_2' thì
T1 JOIN T2 USING(id) JOIN T3 USING(id_2)
trở thành
T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T1.id_2=T3.id_2 AND T2.id_2=T3.id_2)
hoặc
T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T2.id_2=T3.id_2)
hay cái gì khác nữa?
Tìm ra điều này cho một phiên bản cơ sở dữ liệu cụ thể là một bài tập khá đơn giản, nhưng tôi không có nhiều niềm tin rằng nó nhất quán trên tất cả các cơ sở dữ liệu và tôi không phải là người duy nhất phải duy trì mã của mình (vì vậy những người khác cũng sẽ phải biết nó tương đương với cái gì).
Một sự khác biệt rõ ràng với WHERE so với ON là nếu tham gia nằm ngoài:
Giả sử một T1 có một trường ID duy nhất, một hàng chứa giá trị 1 và một T2 có một trường ID và VALUE (một hàng, ID =1, VALUE =6), thì chúng tôi nhận được:
SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID) WHERE T2.VALUE=42
không cung cấp hàng, vì WHERE bắt buộc phải khớp, trong khi
SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID AND T2.VALUE=42)
sẽ đưa ra một hàng với các giá trị
1, NULL, NULL
vì BẬT chỉ được yêu cầu để khớp với kết nối, là tùy chọn do nằm ngoài.