2011-08-25 38 views
6

Tôi cố gắng để chuyển đổi một truy vấn Informix để Oracle:Tham gia bảng trong Oracle (nhiều outer joins)

Truy vấn Informix trông như thế này:

SELECT 
    r.aa, n.bb, nd.cc,u.id, ud.dd, g.attr 
FROM 
    tab1 u, tab2 ud, 
OUTER (tab3 a, tab4 n, tab5 nd, tab6 r, OUTER (tab7 g, tab8 atr)) 
WHERE 
    r.xx = n.xx AND 
    n.nas = a.nas AND 
    a.user = u.user AND 
    a.ac = g.ac AND 
    n.nas1 = nd.nas1 AND 
    u.user1 = ud.user1 AND 
    atr.sso = g.sso AND 
    UPPER(atr.name) = 'NAME' AND 
    u.id = 102 

Truy vấn Oracle trông như thế này:

SELECT 
    r.aa, n.bb, nd.cc,u.id, ud.dd, g.attr 
FROM 
    tab1 u 
INNER JOIN tab2 ud ON 
    u.user1 = ud.user1 AND 
    u.id = 102 
LEFT OUTER JOIN tab3 a ON a.user = u.user 
LEFT OUTER JOIN tab4 n ON n.nas = a.nas 
LEFT OUTER JOIN tab5 nd ON n.nas1 = nd.nas1 
LEFT OUTER JOIN tab6 r ON r.xx = n.xx 

Tôi không chắc chắn cách tham gia hai bảng còn lại.

Bất kỳ ai có thể giúp tôi không?

+0

Cú pháp Informax có nghĩa là gì? –

+0

Bạn đã thử [SQLine] (http://www.sqlines.com/online) chưa? –

Trả lời

0

tôi sẽ cố gắng bổ sung thêm những:

LEFT OUTER JOIN tab7 g ON a.ac = g.ac 
LEFT OUTER JOIN tab8 atr ON g.sso = atr.sso AND UPPER(atr.name) = 'NAME' 
+0

Bàn tab7 và tab8 được nối với nhau; kết quả tổng hợp được nối ngoài với các bảng khác. –

+0

'AND upper (atr.name)' sẽ loại bỏ bản chất bên ngoài bên trái của phép nối. – Ben

7

tôi tin rằng các truy vấn nên tìm một cái gì đó như thế này:

SELECT r.aa, n.bb, nd.cc, u.id, ud.dd, g.attr 
    FROM   tab1 AS u 
     INNER JOIN tab2 AS v ON u.user1 = v.user1 AND u.id = 102 
    LEFT OUTER JOIN tab3 AS a ON a.user = u.user 
    LEFT OUTER JOIN tab4 AS n ON n.nas = a.nas 
    LEFT OUTER JOIN tab5 AS d ON n.nas1 = d.nas1 
    LEFT OUTER JOIN tab6 AS r ON r.xx = n.xx 
    LEFT OUTER JOIN (SELECT g.attr, g.ac 
        FROM tab7 AS x 
        JOIN tab8 AS atr ON x.sso = atr.sso 
        WHERE UPPER(atr.name) = 'NAME' 
       ) AS g ON a.ac = g.ac 

Tôi đã thay đổi bí danh 'thứ' để chỉ 'd' và 'ud' thành 'v' sao cho tất cả các bí danh là các chữ cái đơn. Các lồng nhau OUTER(tab7 g, tab8 atr) trong các ký hiệu Informix chính nó là một tham gia bên trong (như trong sub-chọn trong phiên bản của tôi), nhưng kết quả thiết lập là bên ngoài tham gia với a.ac. Đây là những gì viết lại nói.

Tôi đã sử dụng mệnh đề WHERE trong truy vấn phụ; điều kiện WHERE có thể được để lại trong mệnh đề ON nếu bạn thích. Cơ hội là trình tối ưu hóa sẽ xử lý cả chính xác và tương đương. Tương tự như vậy, các AND u.id = 102 trong tham gia bên trong có thể được đặt vào một mệnh đề WHERE. Một lần nữa, trình tối ưu hóa có thể sẽ đẩy điều kiện lọc xuống để có hiệu suất tốt hơn.

Lưu ý rằng hàm UPPER trong truy vấn phụ có thể yêu cầu quét bảng - trừ khi bạn có chỉ mục chức năng trên UPPER(atr.name).


Xem lại điều này, phiên âm của phần ban đầu của truy vấn không chính xác.

Các truy vấn ban đầu bao gồm các mệnh đề FROM:

FROM tab1 u, tab2 ud, OUTER(tab3 a, tab4 n, tab5 nd, tab6 r, OUTER(tab7 g, tab8 atr)) 

Các bảng tab3, tab4, tab5tab6 là nội gia nhập với nhau, và kết quả là ngoài-nối với tab1tab2. Tương tự, tab8 được kết nối bên trong với tab7, nhưng kết quả của việc đó được kết nối bên ngoài với tham gia bên trong của bảng 3-6. Câu trả lời ban đầu tôi đã cung cấp (dựa trên câu trả lời phác thảo trong câu hỏi) sẽ được biểu diễn trong các ký hiệu Informix cũ sử dụng:

FROM tab1 u, tab2 ud, 
    OUTER(tab3 a, OUTER(tab4 n, OUTER(tab5 nd, OUTER(tab6 r, OUTER(tab7 g, tab8 atr))))) 

Do đó, nó sẽ chính xác hơn để ghi lại các truy vấn ban đầu như:

SELECT r.aa, n.bb, nd.cc, u.id, ud.dd, g.attr 
    FROM tab1 AS u 
    JOIN tab2 AS v ON u.user1 = v.user1 AND u.id = 102 
    LEFT OUTER JOIN 
     (SELECT * 
      FROM tab3 AS a ON a.user = u.user 
      JOIN tab4 AS n ON n.nas = a.nas 
      JOIN tab5 AS d ON n.nas1 = d.nas1 
      JOIN tab6 AS r ON r.xx = n.xx 
      LEFT OUTER JOIN 
       (SELECT g.attr, g.ac 
       FROM tab7 AS x 
       JOIN tab8 AS atr ON x.sso = atr.sso 
       WHERE UPPER(atr.name) = 'NAME' 
       ) AS g ON a.ac = g.ac 
     ) AS loj 

Sự cố còn lại sẽ đảm bảo rằng các bí danh chính xác được sử dụng cho các cột từ truy vấn phụ phức tạp loj. Lưu ý rằng trong trường hợp không có LEFT, RIGHT hoặc FULL, JOIN được giả định là một tham gia INNER; Ngoài ra, nếu bạn chỉ định LEFT, RIGHT hoặc FULL, OUTER là tùy chọn.

Một chi tiết khác cần lưu ý: hành vi của kiểu kết nối Informix OUTER kiểu cũ trong điều kiện bộ lọc không giống như hành vi của các kết nối SQL OUTER chuẩn. Điều này hiếm khi tạo ra sự khác biệt, nhưng đôi khi nó có thể quan trọng. Nhìn chung, hành vi của các kết nối SQL OUTER chuẩn thường là những gì bạn muốn, nhưng nếu bạn chạy kiểm tra hồi quy và thấy rằng có một sự khác biệt trong câu trả lời, lời giải thích có thể là từ tham gia tiêu chuẩn SQL OUTER kiểu mới.

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