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
, tab5
và tab6
là nội gia nhập với nhau, và kết quả là ngoài-nối với tab1
và tab2
. 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ú pháp Informax có nghĩa là gì? –
Bạn đã thử [SQLine] (http://www.sqlines.com/online) chưa? –