سؤال

ولدي ديسيبل الجدول مع علاقة الطفل الأم على النحو التالي:

NodeId    NodeName    ParentId
------------------------------
1         Node1       0
2         Node2       0
3         Node3       1
4         Node4       1
5         Node5       3
6         Node6       5
7         Node7       2

وهنا parentId = 0 يعني أنه من عقدة مستوى الجذر. الآن أريد أن أكتب استعلام SQL الذي سيعود الطفل على جميع المستويات من فئة الوالدين.

ومنها مثلا. لNODEID = 1، يجب أن تعيد 3، 4، 5، 6.

وأستخدمه MS SQL خادم 2005

هل كانت مفيدة؟

المحلول

with [CTE] as (
    select * from [TheTable] c where c.[ParentId] = 1
    union all
    select * from [CTE] p, [TheTable] c where c.[ParentId] = p.[NodeId]
)
select * from [CTE]

نصائح أخرى

ويجب أن ننظر إلى استخدام نموذج متداخلة مجموعة للعلاقات بين الوالدين والطفل ضمن قاعدة بيانات SQL. أنها أجمل بكثير من محاولة لتخزين parentID من السجلات في الجدول مثل هذا، ويجعل الاستفسارات مثل هذا أسهل بكثير.

وفقط للتأكد من أنها تعمل إذا به أحد الوالدين من نفسه (وإلا فإنه سوف عنة حتى وقوعه):

   with [CTE] as (
        select * from [TheTable] c where c.[ParentId] = 1
        union all
        select * from [CTE] p, [TheTable] c where c.[ParentId] = p.[NodeId]
        and c.[ParentId] <> c.[NodeId]
    )
    select * from [CTE]
 WITH Temp_Menu AS
 ( 
  SELECT AM.* from FCB_AccessMenu AM where AM.[ParentId] = 6   

           UNION ALL     

        SELECT AM.* FROM  FCB_AccessMenu AM ,Temp_Menu TM  WHERE AM.[ParentID]=TM.[MenuID]        

  )   

  SELECT * FROM Temp_Menu ORDER BY ParentID
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top