2011-07-05 26 views
6

Tôi đang sử dụng Firebird 2.1. Có một tên bảng Folders, với các lĩnh vực:Làm thế nào bạn có thể phát hiện một phụ huynh có mối quan hệ lồng nhau trong một cơ sở dữ liệu bằng cách sử dụng SQL?

  • FolderID
  • ParentFolderID
  • FolderName

ParentFolderID là -1 nếu đó là thư mục gốc - nếu không nó có chứa ID thư mục mẹ của .

Tôi làm cách nào để tìm tất cả cha mẹ (đến thư mục gốc) của nút cấp thấp?

Tôi có cần truy vấn đệ quy không? (Firebird supports them)

+1

Je ne pas Parle francais;) –

+0

Ngựa Non @OMG: Hãy thử một trang web tiếng Anh :) http://pabloj.blogspot.com/2008/01/new-challenges-new-synthax.html –

+2

@ypercube : Je ne comprende pas: p –

Trả lời

7

Something như thế này:

WITH RECURSIVE hierarchy (folderid, ParentFolderId, FolderName) as (
    SELECT folderid, ParentFolderId, FolderName 
    FROM folders 
    WHERE ParentFolderID = -1 

    UNION ALL 

    SELECT folderid, ParentFolderId, FolderName 
    FROM folders f 
    JOIN hierarchy p ON p.folderID = f.parentFolderID 
) 
SELECT * 
FROM hierarchy 

Sửa: truy vấn sau đây sẽ bước đi trên hệ thống phân cấp "lên", tìm kiếm tất cả các bậc cha mẹ của một thư mục nhất định.

WITH RECURSIVE hierarchy (folderid, ParentFolderId, FolderName) as (
    SELECT folderid, ParentFolderId, FolderName 
    FROM folders 
    WHERE folderid = 42 

    UNION ALL 

    SELECT folderid, ParentFolderId, FolderName 
    FROM folders f 
    JOIN hierarchy p ON p.parentFolderID = f.folderID 
) 
SELECT * 
FROM hierarchy 
+0

Tôi nghĩ rằng truy vấn bạn đăng trả về tất cả các nút con của nút cha. Bạn có một truy vấn tìm thấy tất cả các bậc cha mẹ của một nút con? Cảm ơn. – Steve

+0

Bạn chỉ cần "đảo ngược" điều kiện bắt đầu và điều kiện "truyền tải". Xem chỉnh sửa của tôi –

+0

Cảm ơn bạn điều này hoạt động! Bạn có thể vui lòng trợ giúp thêm một điều nữa không: Tôi đang sử dụng lệnh List để đặt các tên thư mục cùng nhau trong một chuỗi (Child 2/Child 1/Parent). Làm thế nào tôi có thể đảo ngược kết quả của truy vấn để nó trông giống như: Parent/Child 1/Child 2? – Steve

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