Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

एसक्यूएल सर्वर सीटीई - प्रत्येक बच्चे के लिए शीर्ष पेरेंट आईडी खोजें?

क्या आप ऐसा कुछ नहीं कर सकते?

;WITH cte AS (....)
SELECT
    * 
FROM 
    cte
CROSS APPLY 
    dbo.myTable tbl ON cte.XXX = tbl.XXX

CROSS APPLY लगाएं बाद CTE परिभाषा - एक SQL कथन में जो CTE को वापस संदर्भित करता है। क्या वह काम नहीं करेगा??

या: - अपने तर्क के चारों ओर फ़्लिप करें - एक "टॉप-डाउन" सीटीई करें, जो पहले शीर्ष-स्तरीय नोड्स को चुनता है, और फिर पदानुक्रम के माध्यम से पुनरावृत्त करता है। इस तरह, आप पुनरावर्ती CTE के पहले भाग में "शीर्ष-स्तरीय पिता" को आसानी से निर्धारित कर सकते हैं - कुछ इस तरह:

;WITH ChildParent AS
(
    SELECT
        ID,
        ParentID = ISNULL(ParentID, -1),
        SomeName, 
        PLevel = 1,   -- defines level, 1 = TOP, 2 = immediate child nodes etc.
        TopLevelFather = ID  -- define "top-level" parent node
    FROM dbo.[Agent_Agents] 
    WHERE ParentID IS NULL

    UNION ALL

    SELECT
        a.ID,
        ParentID = ISNULL(a.ParentID, -1),
        a.SomeName, 
        PLevel = cp.PLevel + 1,
        cp.TopLevelFather   -- keep selecting the same value for all child nodes
    FROM dbo.[Agent_Agents] a
    INNER JOIN ChildParent cp ON r.ParentID = cp.ID
)
SELECT  
   ID,
   ParentID,
   SomeName,
   PLevel,
   TopLevelFather   
FROM ChildParent

यह आपको कुछ इस तरह से नोड्स देगा (आपके नमूना डेटा के आधार पर, थोड़ा विस्तारित):

ID  ParentID  SomeName      PLevel  TopLevelFather
20    -1      Top#20           1          20
 4    -1      TOP#4            1           4
 8    -1      TOP#8            1           8
 7     8      ChildID = 7      2           8
 3     7      ChildID = 3      3           8
 2     4      ChildID = 2      2           4
 9    20      ChildID = 9      2          20
 5     9      ChildID = 5      3          20
 1     5      ChildID = 1      4          20

अब यदि आप इस सीटीई आउटपुट से किसी विशेष चाइल्ड नोड का चयन करते हैं, तो आपको हमेशा वह सभी जानकारी प्राप्त होगी जो आपको चाहिए - बच्चे के "स्तर" और उसके शीर्ष-स्तरीय पैरेंट नोड सहित।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में मौजूदा तालिका में विदेशी कुंजी बाधा कैसे जोड़ें - SQL सर्वर / TSQL ट्यूटोरियल भाग 68

  2. क्लाइंट पीसी पर लोकलडीबी परिनियोजन

  3. SQL- सभी संग्रहीत प्रक्रियाओं के भीतर एक विशिष्ट शब्द की घटनाओं की गणना करें

  4. SQL सर्वर नामित इंस्टेंस को डिफ़ॉल्ट इंस्टेंस में बदलना

  5. जाँच करें कि क्या किसी स्ट्रिंग में संग्रहीत कार्यविधि का उपयोग करके SQL Server 2005 में एक सबस्ट्रिंग है