Üç sütun NodeId, ParentNodeId, NodeName içeren bir tablom var. Her düğüm için lvl1, lvl2 ve lvl3 düğüm adlarının olduğu "lvl1/lvl2/lvl3 ..." gibi tam bir yol almak istiyorum. Bu bağlantıyı http://www.sql-server-helper.com/functions/get-tree-path.aspx'da yapan bir işlev buldum. ama CTE VEYA herhangi bir başka teknik için verimlilik kullanmak istiyorum. Bunu daha iyi bir şekilde başarmak mümkün ise lütfen bana bildirin. Şimdiden teşekkürler.Tam hiyerarşi yolunu almak için SQL sorgusu
5
A
cevap
6
İşte bir CTE sürümü.
declare @MyTable table (
NodeId int,
ParentNodeId int,
NodeName char(4)
)
insert into @MyTable
(NodeId, ParentNodeId, NodeName)
select 1, null, 'Lvl1' union all
select 2, 1, 'Lvl2' union all
select 3, 2, 'Lvl3'
declare @MyPath varchar(100)
;with cteLevels as (
select t.NodeId, t.ParentNodeId, t.NodeName, 1 as level
from @MyTable t
where t.ParentNodeId is null
union all
select t.NodeId, t.ParentNodeId, t.NodeName, c.level+1 as level
from @MyTable t
inner join cteLevels c
on t.ParentNodeId = c.NodeId
)
select @MyPath = case when @MyPath is null then NodeName else @MyPath + '/' + NodeName end
from cteLevels
order by level
select @MyPath
0
en etkili yolu, benim deneyim, treestructure ait toplevel düğümün kimliğini içeren ek bir alan, RootNodeID eklemek olacaktır. Böylece tüm düğümleri tüm treest yapısında çok basit ve verimli bir şekilde sorgulayabilirsiniz.
Ve bu treest yapısını oluşturmak için uygulamanızda basit bir özyinelemeli işlev gayet iyi çalışmalıdır.
Denormalizasyon olduğunu biliyorum ve bazı insanlar bu kavramı gerçekten onaylamıyor, ancak mesleki deneyimlerimde bunun ayrıntılı bir t-sql betiğinin aksine büyük bir performans artışı getirdiğini öğrendim.
4
Bunu, Joe'nun çözümüne çok benzer şekilde çözdüm.
with cte (NodeId,NodeName,hierarchyPath)as
(
select NodeId,NodeName, NodeName
from Node
where ParentNodeId is null
union all
select n.NodeId, n.NodeName, CONVERT(varchar(256), cte.hierarchyPath + '/' + n.NodeName)
from Node n
join cte on n.ParentNodeId = cte.NodeId
)
select *
from cte
order by NodeId
İlgili konular
- 1. SQL sorgusu, belirtilen çocukları içermeyen üst (iş) almak için (durum)
- 2. SQL sorgusu ayların listesini almak için ay ayından başlayarak
- 3. SQL sorgusu
- 4. SQL sorgusu
- 5. $ _GET SQL sorgusu için çalışmıyor
- 6. SQL sorgusu
- 7. SQL sorgusu
- 8. tabloları için koşullu sql sorgusu
- 9. bash betiği regex dizin yolunu yukarı almak için nth seviyeleri
- 10. findContours için hiyerarşi kullanımı
- 11. Tricky SQL Katılma Sorgusu
- 12. SQL Server 2008 Hiyerarşi Veri Türü Performansı?
- 13. Oracle SQL sorgusu: Zaman
- 14. SQL Server 2008 Hiyerarşi için NHibernate eşlemesi Veri türü
- 15. grails içinde upload benim dosyasının yolunu almak
- 16. SQL sorgusu ---------- kolonlar
- 17. Tam Eşleşme SQL
- 18. Linq to SQL - sorgusu
- 19. Yükseltme sql sorgusu
- 20. Aşağıdaki SQL sorgusu sahip
- 21. SQL sorgusu kaçan + codeigniter
- 22. <img/>'in mutlak yolunu almak
- 23. SQL Sorgusu Performansı Optimizasyonu
- 24. Kümelenmiş dizinleri bulmak için SQL Server sorgusu
- 25. sql sorgusu için varsayılan şema belirleme
- 26. Bir veritabanı şeması için SQL sorgusu
- 27. Verilen sql sorgusu için ölçüt sorgu oluşturma
- 28. Tabloda her bir kimlik için SQL sorgusu
- 29. Ortalama hesaplamalar için SQL sorgusu bilge
- 30. SQL sorgusu hatası -
Bu cevabı benim durumum için uyarlamama yardımcı olabilecek bir ihtimal var mı? http://stackoverflow.com/q/5549480/93202 –