AFAIK, (+)
ký hiệu chỉ hiện diện cho khả năng tương thích ngược vì Oracle đã ra mắt nó trước khi tiêu chuẩn ANSI cho phép nối được đưa ra. Nó dành riêng cho Oracle và bạn nên tránh sử dụng nó trong mã mới khi có phiên bản tuân thủ tiêu chuẩn tương đương.
Có vẻ như có sự khác biệt giữa cả hai và (+)
ký hiệu có những hạn chế mà cú pháp nối ANSI không có. Bản thân Oracle khuyên bạn không nên sử dụng (+)
notation.Mô tả đầy đủ tại đây trong Tham chiếu ngôn ngữ SQL cơ sở dữ liệu Oracle® 11g Phiên bản 1 (11.1):
Oracle khuyến nghị bạn sử dụng
FROM
mệnh đềOUTER JOIN
cú pháp chứ không phải toán tử tham gia Oracle. Các truy vấn kết hợp bên ngoài sử dụng toán tử tham gia Oracle(+)
tuân theo các quy tắc và hạn chế sau, không áp dụng choFROM
mệnh đềOUTER JOIN
cú pháp:
- Bạn không thể chỉ định
(+)
toán tử trong khối truy vấn cũng chứaFROM
cú pháp nối mệnh đề.(+)
toán tử chỉ có thể xuất hiện trongWHERE
hoặc, trong ngữ cảnh tương quan trái (khi chỉ địnhTABLE
) trongFROM
và chỉ có thể được áp dụng cho một cột của bảng hoặc chế độ xem.- Nếu A và B được kết hợp bởi nhiều điều kiện kết hợp, thì bạn phải sử dụng
(+)
trong tất cả các điều kiện này. Nếu bạn không làm như vậy, thì Cơ sở dữ liệu Oracle sẽ chỉ trả về các hàng kết quả từ một phép nối đơn giản, nhưng không có cảnh báo hoặc lỗi để cho bạn biết rằng bạn không có kết quả của một phép nối ngoài.(+)
toán tử không tạo ra một phép nối bên ngoài nếu bạn chỉ định một bảng trong truy vấn bên ngoài và bảng khác trong một truy vấn bên trong.- Bạn không thể sử dụng
(+)
toán tử để tham gia bên ngoài một bảng với chính nó, mặc dù các liên kết tự là hợp lệ.Ví dụ:câu lệnh sau không hợp lệ:
SELECT employee_id, manager_id FROM employees WHERE employees.manager_id(+) = employees.employee_id;
Tuy nhiên, tự tham gia sau là hợp lệ:
SELECT e1.employee_id, e1.manager_id, e2.employee_id FROM employees e1, employees e2 WHERE e1.manager_id(+) = e2.employee_id;
(+)
toán tử chỉ có thể được áp dụng cho một cột, không cho một biểu thức tùy ý. Tuy nhiên, một biểu thức tùy ý có thể chứa một hoặc nhiều cột được đánh dấu bằng(+)
toán tử.- Một
WHERE
điều kiện chứa(+)
toán tử không thể được kết hợp với một điều kiện khác bằng cách sử dụngOR
toán tử logic.- Một
WHERE
điều kiện không thể sử dụngIN
điều kiện so sánh để so sánh một cột được đánh dấu bằng(+)
toán tử với một biểu thức.Nếu
WHERE
mệnh đề chứa một điều kiện so sánh một cột từ bảng B với một hằng số, sau đó là(+)
toán tử phải được áp dụng cho cột để Oracle trả về các hàng từ bảng A mà nó đã tạo null cho cột này. Nếu không, Oracle chỉ trả về kết quả của một phép nối đơn giản.Trong một truy vấn thực hiện các phép nối bên ngoài của hơn hai cặp bảng, một bảng có thể là bảng được tạo null chỉ cho một bảng khác. Vì lý do này, bạn không thể áp dụng
(+)
toán tử cho các cột của B trong điều kiện nối cho A và B và điều kiện nối cho B và C. Tham khảoSELECT
để biết cú pháp cho một phép nối bên ngoài.