Toán tử Oracle (+)


155

Tôi đang kiểm tra một số Báo cáo SQL cũ nhằm mục đích ghi lại chúng và có thể nâng cao chúng.

DBMS là Oracle

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

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

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

Dù sao, tôi đã sử dụng 'Giải thích Kế hoạch' của SQLDeveloper và tôi nhận được kết quả đầu ra HASH JOIN, RIGHT OUTER, v.v.

Sẽ có bất kỳ sự khác biệt nếu tôi loại bỏ (+)toán tử ở cuối truy vấn? Cơ sở dữ liệu có phải đáp ứng một số điều kiện (như có một số chỉ mục, v.v.) 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!


1
Đó không phải là một nhà điều hành. Nó chỉ là một phần cú pháp ảnh hưởng đến những gì THAM GIA làm.
philipxy

Câu trả lời:


186

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

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

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

Liên kết này là khá tốt để giải thích sự khác biệt giữa THAM GIA .


Cũng cần lưu ý rằng mặc dù các (+)công trình, Oracle khuyên bạn không nên sử dụng nó :

Oracle khuyên bạn nên sử dụng cú pháp FROMmệnh đề OUTER JOINhơn là toán tử tham gia Oracle. Các truy vấn nối ngoài sử dụng toán tử nối Oracle (+)phải tuân theo các quy tắc và hạn chế sau, không áp dụng cho cú pháp FROMmệnh đề OUTER JOIN:


79
Hoàn toàn chính xác. Để giữ (+) thẳng trong đầu (bên trái so với bên phải), tôi muốn nghĩ (+) là "thêm giá trị NULL nếu không tìm thấy kết quả khớp". Ví dụ: "a.id = b.id (+)" có nghĩa là cho phép b.id trở thành NULL nếu không có kết quả khớp với a.id.
bãi biển

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

Bạn có thể muốn có một liên kết tại tài liệu chính thức của Oracle: docs.oracle.com/html/A95915_01/sqopr.htmlm
Vargan

27

Toán tử (+) chỉ ra một phép nối ngoài. Điều này có nghĩa là Oracle vẫn sẽ trả lại các bản ghi từ phía bên kia của tham gia 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 giao cho một bộ phận thì câu lệnh sau sẽ trả về chi tiết của tất cả nhân viên cho dù họ có được giao cho 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, loại bỏ (+) có thể tạo ra sự khác biệt quan trọng nhưng bạn có thể không nhận thấy trong một thời gian tùy thuộc vào dữ liệu của bạn!


25

Trong Oracle, (+) biểu thị bảng "tùy chọn" trong THAM GIA. 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à một THAM GIA TRÊN TRÁI PHIẾU của bảng 'b' sang bảng 'a'. Nó sẽ trả về tất cả dữ liệu của bảng 'a' mà không mất dữ liệu khi phía bên kia (bảng tùy chọn 'b') không có dữ liệu.

Sơ đồ bên trái tham gia

Cú pháp tiêu chuẩn hiện đại cho cùng một truy vấn sẽ là

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

hoặc với một tốc ký cho a.id=b.id(không được hỗ trợ bởi tất cả các cơ sở dữ liệu):

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b USING(id)

Nếu bạn xóa (+) thì đó sẽ là truy vấn nối bên trong bình thường

Cú pháp cũ hơn, trong cả Oracle và các cơ sở dữ liệu khác:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id

Cú pháp hiện đại hơn:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
INNER JOIN b ON a.id=b.id

Hoặc đơn giản:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
JOIN b ON a.id=b.id

Sơ đồ của Tham gia Nội bộ

Nó sẽ chỉ trả về tất cả dữ liệu trong đó cả hai giá trị 'a' & 'b' id 'đều giống nhau, có nghĩa là phần chung.

Nếu bạn muốn làm cho truy vấn của mình trở thành Tham gia đúng

Điều này giống như một TRÁI PHIẾU, nhưng chuyển đổi bảng nào là tùy chọn.

Sơ đồ bên ngoài tham gia

Cú pháp cũ của Oracle:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id(+)=b.id

Cú pháp tiêu chuẩn hiện đại:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
RIGHT JOIN b ON a.id=b.id

Tham khảo & giúp đỡ:

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

Bên trái Tham gia bằng cách sử dụng dấu + trong Oracle 11g

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


Các nhãn hình tròn "table1" & "table2" là vô nghĩa. Ý nghĩa đơn giản nhất cho các phần tử vòng tròn là các hàng đầu ra. Sau đó, lưỡi liềm bên trái chứa các hàng mở rộng null của bảng1 & lưỡi liềm bên phải chứa các hàng mở rộng null của bảng2. Các ý nghĩa khác cho các vòng tròn là tối nghĩa. Chính xác thì bạn nghĩ sơ đồ có ý nghĩa gì? Tại sao bạn lại đưa chúng vào mà không sao chép một cách mù quáng các bài thuyết trình (xấu) của người khác?
philipxy

Bây giờ bạn đã gắn nhãn các vòng tròn a & b. Các vòng tròn không phải là hàng của a & b. Các vòng tròn bên trái và bên phải có thể được gắn nhãn hợp lý các hàng của một liên kết bên trái b & một tham gia bên phải b. Hơn nữa, bạn không mô tả những hàng được bao quanh đó là gì về đầu vào. Làm việc cho chính mình những gì trong vòng tròn. Nếu bạn định dán nhãn a & b trên các vòng tròn, hãy giải thích rõ ràng bằng từ ngữ mỗi nhãn phải làm gì với vòng tròn của nó. (Không có lý do đơn giản để gắn nhãn cho chúng a & b.) Thật tốt khi bạn gắn nhãn chính xác cho các vùng màu xanh lá cây.
philipxy

6

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


(+) Được đặt ngay bên phải tên cột. Câu trả lời này không rõ ràng về điều đó. "Trong thực tế" nghĩa là gì? (Hùng biện.) (Và có lẽ bạn không có nghĩa là "tuyên bố".)
philipxy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.