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

CTE में अनंत लूप जब स्व-संदर्भ तालिका को पार्स करते हैं

अनंत लूप का कारण पहला रिकॉर्ड है जहां empid=mgrid . इस समस्या से निपटने के लिए आपको एक संचयी फ़ील्ड (levels .) शामिल करना चाहिए इस उदाहरण में) mgrid को स्टोर करने के लिए आप पहले ही संसाधित कर चुके हैं और जांचें कि क्या emid लूप से बचने के लिए पहले से ही इस सूची में है।

यहाँ एक प्रश्न है:

with Tree as
        (
        SELECT  empid
        ,       mgrid
        ,       1 as lv
        ,       1 as level1
        ,       null as level2
        ,       null as level3
        ,       null as level4
        ,       null as level5
        ,       cast(mgrid as varchar(max)) levels  
        FROM    Employees
        WHERE   empid = 1 and mgrid = 1
        UNION ALL
        SELECT  E.empid
        ,       E.mgrid
        ,       T.lv + 1
        ,       T.level1
        ,       case when T.lv = 1 then E.empid else t.level2 end
        ,       case when T.lv = 2 then E.empid else t.level3 end
        ,       case when T.lv = 3 then E.empid else t.level4 end
        ,       case when T.lv = 4 then E.empid else t.level5 end
        ,       T.levels+','+cast(E.mgrid as varchar(max)) levels   

          FROM    Employees AS E
        JOIN    Tree T
        ON      E.mgrid = T.empid 
                and (','+T.levels+',' 
                      not like 
                     '%,'+cast(E.empid as varchar(max))+',%')
        )
select  *
from Tree
order by empid

और यह रहा SQLFiddle डेमो




  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 सर्वर से INSERT INTO का उपयोग करना

  2. एसक्यूएल बल्क इंसर्ट के साथ शून्य मान नहीं डालेगा

  3. बल्क इंसर्ट निश्चित चौड़ाई वाले क्षेत्र

  4. कैसे ठीक करें "से क्लॉज में बल्क रोसेट के लिए एक सहसंबंध नाम निर्दिष्ट किया जाना चाहिए।" SQL सर्वर में

  5. एसक्यूएल में एक स्ट्रिंग कॉलम के लिए इंडेक्स कैसे बनाएं?