Tôi thấy điều này sau khi nâng cấp từ Oracle 11g Release 1 đến Thả 2.Oracle 11g Release 1 vs 2 - hành vi khác nhau của LEFT OUTER JOIN
Điều tốt nhất tôi có thể tóm tắt nó ngay bây giờ là một LEFT OUTER JOIN
chống lại một truy vấn với một cột "giả" không đổi và một mệnh đề WHERE
tạo ra các kết quả khác nhau trong hai Oracle RELEASES. Trong Bản phát hành 2, cột "giả" hiển thị trong các hàng chưa được đối sánh:
TEST1 TEST2
===== =====
A B A B
- --- - ---
1 bar 1 hello
2 baz
> SELECT * FROM test1 LEFT OUTER JOIN test2 ON test1.a = test2.a;
A B A_1 B_1
- --- --- -----
1 bar 1 hello
2 baz
Cho đến giờ, rất tốt. tất cả các công trình trên đều giống nhau trên Rel. 1 và 2. Bây giờ, thêm một 'giả' cột X không đổi, và mọi thứ làm việc như mong đợi:
> SELECT *
FROM test1
LEFT OUTER JOIN (SELECT test2.*, 'X' AS X
FROM test2) test3
ON test1.a = test3.a;
A B A_1 B_1 X
- --- --- ----- -
1 bar 1 hello X
2 baz
Bây giờ, thêm một điều khoản WHERE
trên bảng đầu tiên và nhận được khác nhau kết quả:
> SELECT *
FROM test1
LEFT OUTER JOIN (SELECT test2.*, 'X' AS X
FROM test2) test3
ON test1.a = test3.a
WHERE test1.b LIKE 'ba%';
Release 11.1.0.7.0 Release 11.2.0.2.0
================== ==================
A B A_1 B_1 X A B A_1 B_1 X
- --- --- ----- - - --- --- ----- -
1 bar 1 hello X 1 bar 1 hello X
2 baz 2 baz X <--- WHAT'S THIS?!
tiếp tục bối rối: nếu điều kiện WHERE là số (ví dụ, WHERE test1.a < 5
, kết quả đều giống nhau
UPDATE (để làm rõ câu hỏi thực tế của tôi): Tôi đang làm gì sai? Truy vấn cuối cùng của tôi bằng cách nào đó gọi một hành vi không xác định làm cho nó OK cho Oracle để thay đổi những gì được trả về từ một bản phát hành tiếp theo? Nếu không, đây có phải là lỗi của Oracle không?
Nếu đó là câu hỏi, nó không thực sự rõ ràng. –
@dystroy, tôi đã thêm bản cập nhật, cố gắng đặt câu hỏi của mình rõ ràng. – Arkady
Mức độ chi tiết này có thể phù hợp hơn với stackexchange DBA. –