2009-02-05 44 views
14

Tôi đã gặp một số truy vấn SQL trong Oracle có chứa '(+)' và tôi không biết ý nghĩa của nó. Ai đó có thể giải thích mục đích của nó hoặc cung cấp một số ví dụ về việc sử dụng nó? Cảm ơnÝ nghĩa của (+) trong truy vấn SQL

+0

dupe: http://stackoverflow.com/questions/430274/oracle-what-does-do-in-a-where-clause – Alkini

+1

Tôi thực sự đã thử tìm kiếm câu trả lời trước khi đăng câu hỏi nhưng không nhận được bất kỳ câu hỏi nào kết quả khi tìm kiếm '+' hoặc '(+). Thật kỳ lạ khi tiêu đề câu hỏi trong URL dường như cũng bỏ qua phần (+). – Zabbala

+0

Đây là bản sao của [bài đăng này] (http://stackoverflow.com/questions/430274/oracle-what-does-do-in-a-where-clause). Bạn có thể tìm thêm một số thông tin ở đó. –

Trả lời

35

Đó là từ đồng nghĩa của Oracle cho OUTER JOIN.

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

cho cùng một kết quả như

SELECT * 
FROM a 
    LEFT OUTER JOIN b 
    ON b.id = a.id 
+0

Tôi sẽ lưu ý cho người tiếp theo, chú ý đến những gì đã xảy ra với 'a' và' b' ở đây. Trong ví dụ mệnh đề from là '[a, b]', nhưng kiểm tra tương đương là '[b.id = a.id]'. Thói quen của tôi là giữ sự tương đương '[a.id = b.id]'; vì vậy tôi đã đọc sai ví dụ. Một giờ trong cuộc đời của tôi, tôi sẽ không lấy lại; ^) – BIBD

+0

Để làm điều đó, tôi sẽ giải thích '(+)' như cách nói của oracle "bên này bị vô giá trị khi không tìm thấy kết quả phù hợp". Sử dụng định mức của tôi cho tương đương '[a.id = b.id]'; thì có một tấm gương đang xảy ra. Nếu tôi viết lại truy vấn theo tiêu chuẩn hiện đại, '[a.id = b.id (+)]' trở thành một LEFT OUTER và '[a.id (+) = b.id]' trở thành một RIGHT OUTER. – BIBD

+0

Điều là toán tử (+) đượ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 (bảng được phép chứa giá trị rỗng hoặc rỗng trong điều kiện). – Yergalem

4

Các + là một cắt ngắn cho OUTER JOIN, tùy thuộc vào phía bạn đặt nó trên, nó cho thấy một LEFT hoặc RIGHT OUTER JOIN

Kiểm tra mục nhập thứ hai trong số this forum post đối với một số ví dụ

2

IIRC, dấu + được sử dụng trong các phiên bản cũ hơn của Oracle để biểu thị phép nối ngoài trong cú pháp nối SQL pre-ANSI. Nói cách khác:

select foo,bar 
from a, b 
where a.id = b.id+ 

là tương đương với

select foo,bar 
from a left outer join b 
on a.id = b.id 

LƯU Ý: đây có thể là ngược/hơi không chính xác, như tôi đã không bao giờ sử dụng cú pháp SQL pre-ANSI.

+1

Nó được sử dụng trong các phiên bản mới hơn của Oracle cho những người trong chúng ta ghét ANSI sql. –

+0

@Mark Brady chính xác. Tôi cảm thấy nó làm cho mục đích của truy vấn rõ ràng hơn. Và tôi cũng * ghét * ANSI SQL. –

2

Bạn sử dụng điều này để đảm bảo rằng bảng bạn đang tham gia không làm giảm số lượng bản ghi được trả lại. Vì vậy, nó tiện dụng khi bạn đang tham gia vào một bảng mà có thể không có một bản ghi cho mỗi khóa bạn đang tham gia.

Ví dụ, nếu bạn đang tham gia một khách hàng và mua hàng bảng:

Để danh sách các tất cả khách hàng và tất cả các mua hàng của họ, bạn muốn làm một phép nối ngoài (+) trên bàn mua hàng để khách hàng mà chưa mua bất cứ thứ gì vẫn hiển thị trong báo cáo của bạn.

Các vấn đề liên quan