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

SQL में एक शीर्ष स्तरीय अभिभावक ढूँढना

आप इसे प्राप्त करने के लिए पुनरावर्ती CTE का उपयोग कर सकते हैं:

DECLARE @childID INT 
SET @childID  = 1 --chield to search

;WITH RCTE AS
(
    SELECT *, 1 AS Lvl FROM RelationHierarchy 
    WHERE ChildID = @childID

    UNION ALL

    SELECT rh.*, Lvl+1 AS Lvl FROM dbo.RelationHierarchy rh
    INNER JOIN RCTE rc ON rh.CHildId = rc.ParentId
)
SELECT TOP 1 id, Name
FROM RCTE r
inner JOIN dbo.Person p ON p.id = r.ParentId
ORDER BY lvl DESC

SQLFiddle डेमो

संपादित करें - सभी बच्चों के लिए शीर्ष स्तर के माता-पिता के लिए अद्यतन अनुरोध के लिए:

;WITH RCTE AS
(
    SELECT  ParentId, ChildId, 1 AS Lvl FROM RelationHierarchy 

    UNION ALL

    SELECT rh.ParentId, rc.ChildId, Lvl+1 AS Lvl 
    FROM dbo.RelationHierarchy rh
    INNER JOIN RCTE rc ON rh.ChildId = rc.ParentId
)
,CTE_RN AS 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY r.ChildID ORDER BY r.Lvl DESC) RN
    FROM RCTE r

)
SELECT r.ChildId, pc.Name AS ChildName, r.ParentId, pp.Name AS ParentName
FROM CTE_RN r
INNER JOIN dbo.Person pp ON pp.id = r.ParentId
INNER JOIN dbo.Person pc ON pc.id = r.ChildId
WHERE RN =1

SQLFiddle डेमो

EDIT2 - सभी व्यक्तियों को अंत में थोड़ा सा जॉइन बदलने के लिए:

SELECT pc.Id AS ChildID, pc.Name AS ChildName, r.ParentId, pp.Name AS ParentName
FROM dbo.Person pc 
LEFT JOIN CTE_RN r ON pc.id = r.CHildId AND  RN =1
LEFT JOIN dbo.Person pp ON pp.id = r.ParentId

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. डेटाबेस और रिलेशनल डेटाबेस मैनेजमेंट सिस्टम (RDBMS) क्या है

  2. मैं एक SQL सर्वर VARBINARY कॉलम में बाइट [] कैसे सम्मिलित करूं?

  3. मैं संग्रहीत प्रक्रिया में पैरामीटर के रूप में सूची कैसे पास करूं?

  4. SQL सर्वर डेटाबेस बैकअप निचले संस्करण पर पुनर्स्थापित करें

  5. एक कॉलम बदलना:शून्य से शून्य नहीं