SORU
18 Kasım 2009, ÇARŞAMBA


Basit bir özyinelemeli-katıl kendi SQL Server yapmak için bir yol?

Bir özyinelemeli-katıl kendi SQL Server yapmanın en kolay yolu nedir? Böyle bir tablo var:

PersonID | Initials | ParentID
1          CJ         NULL
2          EB         1
3          MB         1
4          SW         2
5          YT         NULL
6          IS         5

Ve kayıtları bir hiyerarşi belirli bir kişi ile başlayan sadece ilgili elde edebilmek istiyorum. Eğer CJ hiyerarşi istedim Eğer PersonİD=1 olsun diye:

PersonID | Initials | ParentID
1          CJ         NULL
2          EB         1
3          MB         1
4          SW         2

Ve EB için almak istiyorum:

PersonID | Initials | ParentID
2          EB         1
4          SW         2

Biraz bu yolda kaldım o ayrı sabit derinlemesine bir yanıt katılıyor bir sürü göre nasıl yapılacağını düşünemiyorum. Bu pek çok düzeyde olmayacak, çünkü bu olur ama bunu doğru yapmak istiyorum gibi bir şey yapmaz.

Teşekkürler! Chris.

CEVAP
18 Kasım 2009, ÇARŞAMBA


WITH    q AS 
        (
        SELECT  *
        FROM    mytable
        WHERE   ParentID IS NULL -- this condition defines the ultimate ancestors in your chain, change it as appropriate
        UNION ALL
        SELECT  m.*
        FROM    mytable m
        JOIN    q
        ON      m.parentID = q.PersonID
        )
SELECT  *
FROM    q

Sipariş durumu ekleyerek, ağaç düzeni korumak

WITH    q AS 
        (
        SELECT  m.*, CAST(ROW_NUMBER() OVER (ORDER BY m.PersonId) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN AS bc
        FROM    mytable m
        WHERE   ParentID IS NULL
        UNION ALL
        SELECT  m.*,  q.bc   '.'   CAST(ROW_NUMBER() OVER (PARTITION BY m.ParentID ORDER BY m.PersonID) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN
        FROM    mytable m
        JOIN    q
        ON      m.parentID = q.PersonID
        )
SELECT  *
FROM    q
ORDER BY
        bc

ORDER BY bu durumu değiştirerek kardeşler sıralamasını değiştirebilirsiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Damien Hayes

    Damien Hayes

    11 Mart 2008
  • Google

    Google

    18 EYLÜL 2005
  • magnum33563

    magnum33563

    8 NİSAN 2011