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ş:
Yapmam gereken Internet Explorer 8 ken...
Nasıl bir div kalan Yatay Boşluk (CSS ...
Nasıl seri katıl bir yöntem sözdizimi ...
Nasıl BASİT C Makefile yapmak için?...
Yapmak için en iyi yolu SQL Server cas...