Trường hợp cú pháp tham gia bên ngoài đặc biệt của Oracle


16

Tôi đã thấy những điều sau đây trong một truy vấn được cho là được chuyển từ cú pháp nối ngoài của Oracle sang cú pháp nối ngoài tiêu chuẩn SQL:

SELECT ...
FROM A, B, C, D, E
WHERE A.A_ID = B.A_ID
AND B.B_ID = C.A_ID(+)
AND B.B_KEY = C.B_KEY(+)
AND C.C_ID = D.C_ID(+)
AND B.A_ID = E.A_ID(+)
AND B.B_KEY = E.B_KEY(+)
AND 'CONSTANT' = C.X_ID(+)

Bây giờ dịch cú pháp nối ngoài thường là một quá trình cơ học, nhưng dòng cuối cùng đó đã làm tôi bối rối. Nó có nghĩa là gì? Nó có tác dụng gì?

Câu trả lời:


11

Tôi đã cố gắng thực hiện quá trình cơ học. Tôi hy vọng tôi nhớ nó đúng.

Điều này dẫn đến:

SELECT ...
FROM A
         join B on A.A_ID = B.A_ID
    left join C on B.B_ID = C.A_ID and B.B_KEY = C.B_KEY and 'CONSTANT' = C.X_ID
    left join D on C.C_ID = D.C_ID
    left join E on B.A_ID = E.A_ID and B.B_KEY = E.B_KEY

Nói tóm lại, tôi nghĩ câu trả lời của Leigh Riffel là đúng.

Ghi chú

ngày xưa quy tắc ghi nhớ là: oracle trong đó Aa = Bb (+) trở thành Aa * = Bb trong SQL-Server cú pháp cũ, dấu cộng đi về phía đối diện và trở thành một ngôi sao, có nghĩa là A trái tham gia B trên Aa = Bb


10

Dòng yêu cầu c.X_ID bằng với giá trị không đổi hoặc không có bản ghi từ bảng C. Tất nhiên vì nó được nối lại nên nó sẽ không giới hạn các bản ghi từ bảng A, chỉ giới hạn các bản ghi từ bảng C được nối. Đây là một minh chứng:

Thiết lập:

CREATE TABLE T1 as (select rownum+1 t1_id from dual connect by rownum <= 4);
CREATE TABLE T2 as (
   select rownum t1_id, DECODE(rownum,2,'CONSTANT',3,'NoMatch') CompareField 
   from dual connect by rownum <= 3
);
SELECT * FROM T1;
SELECT * FROM T2;

Các kết quả:

SELECT T1.t1_id, T2.t1_id, T2.CompareField
FROM T1, T2
WHERE T1.t1_id = T2.t1_id(+)
AND 'CONSTANT' = T2.CompareField(+)
ORDER BY 1;

Hoặc là:

SELECT T1.t1_id, T2.t1_id, T2.CompareField
FROM T1 LEFT JOIN T2 ON T1.t1_id = T2.t1_id 
AND 'CONSTANT' = T2.CompareField
ORDER BY 1;
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.