2011-07-05 19 views
6

Firebird 2.1 kullanıyorum. Bir tablo adı Folders alanlar vardır:SQL kullanarak veritabanında yuvalanmış bir ilişki olan bir üsteki nasıl algılarsınız?

  • ParentFolderID
  • folderID
  • Klasöradı

ParentFolderID -1 o kök klasör ise - aksi takdirde üst klasörün kimliği içerir .

Düşük düzey düğümün tüm ana babalarını (kök klasöre kadar) nasıl bulabilirim?

Yinelemeli bir sorguya ihtiyacım var mı? (Firebird supports them) böyle

+1

Je ne parle pas francais;) –

+0

@OMG Poniler: Bir İngiliz siteyi deneyin :) http://pabloj.blogspot.com/2008/01/new-challenges-new-synthax.html –

+2

@ypercube : Je ne comprende pas: p –

cevap

7

şey:

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 

Düzenleme: Belirli bir klasörün tüm ebeveynler bulma hiyerarşisi "yukarı", yol gösterecektir aşağıdaki sorgu.

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

Gönderdiğiniz sorgu bir üst düğümü tüm childs verir düşünüyorum. Çocuk düğümünün tüm ebeveynlerini bulan bir sorgunuz var mı? Teşekkürler. – Steve

+0

Sadece başlangıç ​​koşulunu ve "geçiş" koşulunu "tersine" çevirmeniz gerekir. Benim düzenleme gör –

+0

Teşekkür ederim bu çalışır! Bir şeyle ilgili daha fazla yardımcı olabilir misiniz? Katlama listelerini bir dizeye (Child 2/Child 1/Parent) koymak için List komutunu kullanıyorum. Sorgunun sonucunu nasıl tersine çevirebilirim ki şöyle görünecektir: Ebeveyn/Çocuk 1/Çocuk 2? – Steve

İlgili konular