2010-10-26 49 views
117

Tôi đang kiểm tra một số câu lệnh SQL cũ cho mục đích ghi lại chúng và có thể tăng cường chúng.Nhà điều hành Oracle "(+)"

DBMS là Oracle

tôi không hiểu một tuyên bố mà đọc như thế này:

select ... 
from a,b 
where a.id=b.id(+) 

Tôi đang bối rối về các nhà điều hành (+), và không thể có được nó ở bất kỳ diễn đàn ... (tìm kiếm dấu + trong dấu ngoặc kép cũng không hoạt động).

Dù sao, tôi sử dụng 'Kế hoạch Giải thích' của SQLDeveloper và tôi có một đầu ra nói rằng HASH JOIN, RIGHT OUTER vv

Nên có bất kỳ sự khác biệt nếu tôi loại bỏ các nhà điều hành (+) ở phần cuối của các truy vấn? Cơ sở dữ liệu có đáp ứng một số điều kiện (như có một số chỉ mục, vv) trước khi (+) có thể được sử dụng không ?? Nó sẽ rất hữu ích nếu bạn có thể cung cấp cho tôi một sự hiểu biết đơn giản, hoặc một số liên kết tốt, nơi tôi có thể đọc về điều này.

Cảm ơn!

Trả lời

147

Đó là ký pháp cụ thể của Oracle cho OUTER JOIN, vì định dạng ANSI-89 (sử dụng dấu phẩy trong mệnh đề FROM để tách các tham chiếu bảng) không chuẩn hóa các kết nối OUTER.

Truy vấn sẽ được viết lại trong ANSI-92 cú pháp như sau:

SELECT ... 
    FROM a 
LEFT JOIN b ON b.id = a.id 

This link is pretty good at explaining the difference between JOINs.


Nó cũng cần lưu ý rằng mặc dù (+) công trình, Oracle recommends not using it:

Oracle khuyến cáo rằng bạn sử dụng cú pháp FROM khoản OUTER JOIN chứ không phải là Oracle tham gia điều hành. Bên ngoài tham gia truy vấn sử dụng Oracle tham gia điều hành (+) phải tuân thủ các quy tắc sau đây và những hạn chế, mà không áp dụng cho các khoản FROMOUTER JOIN cú pháp:

+0

Oh cảm ơn! - Không ngờ gì cả !! – Sekhar

+60

Chính xác. Để giữ (+) thẳng trong đầu của tôi (bên trái so với bên phải), tôi thích nghĩ (+) là "thêm giá trị NULL nếu không tìm thấy kết quả phù hợp". Ví dụ: "a.id = b.id (+)" nghĩa là cho phép b.id thành NULL nếu không khớp với a.id. – beach

+0

thanks..I đoán việc thêm nó vào từ mệnh đề sẽ mang lại kết quả tương tự !! –

24

The (+) điều hành cho thấy một bên ngoài tham gia. Điều này có nghĩa rằng Oracle sẽ vẫn trả về các bản ghi từ phía bên kia của phép nối ngay cả khi không có kết quả khớp. Ví dụ nếu a và b là emp và dept và bạn có thể có nhân viên chưa được gán cho một bộ phận thì câu sau sẽ trả lại chi tiết của tất cả nhân viên cho dù họ có được giao cho một bộ phận hay không.

select * from emp, dept where emp.dept_id=dept.dept_id(+) 

Vì vậy, trong ngắn hạn, việc xóa (+) có thể tạo sự khác biệt có ý nghĩa nhưng bạn có thể không nhận thấy một thời gian tùy thuộc vào dữ liệu của bạn!

5

Trong thực tế, biểu tượng + được đặt trực tiếp trong câu lệnh có điều kiện và ở bên cạnh bảng tùy chọn (bảng được phép chứa giá trị trống hoặc giá trị rỗng trong điều kiện).

8

Trong Oracle, (+) biểu thị bảng "tùy chọn" trong JOIN.Vì vậy, trong truy vấn của bạn,

select a.id, b.id, a.col_2, b.col_2, ... 
from a,b 
where a.id=b.id(+) 

đó là bảng LEFT OUTER JOIN 'b' với bảng 'a'. Giống như truy vấn tham gia trái hiện đại. (Nó sẽ trả về tất cả dữ liệu của 'a' bảng mà không mất dữ liệu của nó ở phía bên kia không bắt buộc bảng 'b' có thể bị mất dữ liệu của mình) enter image description here

select a.id, b.id, a.col_2, b.col_2, ... 
from a 
Left join b ON a.id=b.id 

HOẶC

select a.id, b.id, a.col_2, b.col_2, ... 
from a 
Left join b using(id) 

bây giờ nếu bạn loại bỏ (+) sau đó nó sẽ bình thường bên tham gia truy vấn,

select a.id, b.id, a.col_2, b.col_2, ... 
from a,b 
where a.id=b.id 

enter image description here

nó sẽ chỉ trả về tất cả dữ liệu mà cả hai 'a' & 'b' bảng 'id' giá trị là như nhau, có nghĩa là một phần phổ biến.

tắm: Nếu bạn muốn chắc truy vấn của bạn như phải tham gia ở định dạng cũ hoặc hiện đại sau đó nó sẽ xuất hiện như như dưới đây:

enter image description here

Cũ:

select a.id, b.id, a.col_2, b.col_2, ... 
from a,b 
where a.id(+)=b.id 

hiện đại:

select a.id, b.id, a.col_2, b.col_2, ... 
from a 
Right join b ON a.id=b.id 

HOẶC

select a.id, b.id, a.col_2, b.col_2, ... 
from a 
Right join b using(id) 

Ref & giúp đỡ:

https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187

Left Outer Join using + sign in Oracle 11g

https://www.w3schools.com/sql/sql_join_left.asp