2009-11-03 38 views
5

Tôi đang cố gắng chuyển đổi một số truy vấn SQL Oracle để làm việc với (trong lý thuyết) bất kỳ cơ sở dữ liệu SQL nào. Một số truy vấn có tính phân cấp trong tự nhiên và được viết bằng CONNECT BY.Tiêu chuẩn thay thế cho CONNECT BY?

Có phương án SQL chuẩn nào cho cú pháp START WITH ... CONNECT BY của Oracle không? Hoặc có một số quy trình được khuyến nghị tôi nên theo dõi để chuyển đổi các truy vấn phân cấp?

+0

Không có bất kỳ ANSI cú pháp truy vấn thứ bậc mà tôi m nhận thức được - nó khác nhau giữa SQL Server, MySQL và Postgres ít nhất. –

Trả lời

6

Trong Oracle 11gR2, chúng hỗ trợ đệ quy trong Biểu thức bảng chung (điều mà hầu hết mọi người Oracle biết là bao thanh toán truy vấn phụ, tức là mệnh đề WITH). Vì đây là cách làm việc ANSI nên nó phải di động hơn.

Tom Kyte viết về Truy vấn con nhiệm đệ quy trong November 09 edition of Oracle magazine.

+0

AFAIK: SQL Server, Oracle và DB2 là các cơ sở dữ liệu duy nhất hỗ trợ mệnh đề 'WITH'. Tôi không biết liệu phiên bản DB2 có hỗ trợ đệ quy hay không ... –

2

Nếu bạn cần truy vấn phân cấp đối với cơ sở dữ liệu không hỗ trợ tính toán truy vấn con đệ quy (xem APC's answer), một thay thế công nghệ rất thấp là mã hóa cấu trúc phân cấp thành khóa riêng. Tất nhiên điều này sẽ chỉ hoạt động nếu bạn có thể kiểm soát quá trình cập nhật bảng và viết lại các cập nhật chính sau đây của cha mẹ.

Ví dụ:

FLAT_HIER_ID NODE_ID PARENT_NODE_ID 
~N1   N1 
~N1~N2  N2  N1 
~N1~N2~N3  N3  N2 
~N1~N2~N4  N4  N2 

Không rất thanh lịch, nhưng nó mang lại cho bạn một lộ trình để truy vấn.

Tùy chọn khác (có thể tốt hơn) là sử dụng phương thức "Nested Set Model". Đây là phương thức được sử dụng trong Fogbugz để xử lý truy vấn con trong MSSQL, MySQL và MS Access.

Mô hình này được giải thích tại địa chỉ:

http://www.developersdex.com/gurus/articles/112.asp

Việc sử dụng các phương pháp trong Fogbugz được mô tả tại địa chỉ:

http://www.fogcreek.com/FogBugz/blog/post/Subcases-and-Hierarchy.aspx

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