Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Sự khác biệt giữa ký hiệu cộng (+) của Oracle và ký hiệu ansi JOIN?

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 cho FROM 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ứa FROM cú pháp nối mệnh đề.
  • (+) toán tử chỉ có thể xuất hiện trong WHERE hoặc, trong ngữ cảnh tương quan trái (khi chỉ định TABLE ) trong FROM 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ụng OR toán tử logic.
  • Một WHERE điều kiện không thể sử dụng IN đ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ảo SELECT để biết cú pháp cho một phép nối bên ngoài.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Các giá trị được phân tách bằng dấu phẩy trong Oracle

  2. Làm cách nào để giới hạn số hàng được trả về bởi một truy vấn Oracle sau khi đặt hàng?

  3. lấy ra tham số từ thủ tục được lưu trữ?

  4. Hibernate> CLOB> Oracle :(

  5. Trục động trong sql oracle