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

एक पदानुक्रम तालिका में किसी आइटम के सभी माता-पिता को सीमांकित स्ट्रिंग के रूप में सूचीबद्ध करना SQL

ऐसा लगता है कि यह चाल है। कुंजी यह महसूस करना है कि हम पीछे की ओर रास्ता बना सकते हैं और तब रुक सकते हैं जब हमारे पास पता लगाने के लिए माता-पिता न हों:

DECLARE @t table (ID int not null, Name varchar(19) not null, ParentID int null)
insert into @t(ID,Name,ParentID) values
(1 ,'Alex',null),
(2 ,'John',null),
(3 ,'Don',1),
(4 ,'Philip',2),
(5 ,'Shiva',2),
(6 ,'San',3),
(7 ,'Antony',6),
(8 ,'Mathew',2),
(9 ,'Cyril',8),
(10,'Johan',9)

declare @search table (ID int not null)
insert into @search (ID) values (7),(10)

;With Paths as (
    select s.ID as RootID,t.ID,t.ParentID,t.Name, CONVERT(varchar(max),t.Name) as Path
    from
        @search s
            inner join
        @t t
            on
                s.ID = t.ID
    union all
    select p.RootID,t.ID,t.ParentID,p.Name, t.Name + '->' + p.Path
    from Paths p
            inner join
        @t t
            on
                p.ParentID = t.ID
)
select * from Paths where ParentID is null

परिणाम:

RootID      ID          ParentID    Name                Path
----------- ----------- ----------- ------------------- ----------------------------
10          2           NULL        Johan               John->Mathew->Cyril->Johan
7           1           NULL        Antony              Alex->Don->San->Antony

(मैंने अंतिम स्थिति दिखाने में मदद के लिए अतिरिक्त कॉलम छोड़े हैं। बिना फ़िल्टर किए सीटीई को क्वेरी करना भी शिक्षाप्रद हो सकता है)

मैं यह भी सावधानी बरतता हूं कि यदि संभव हो तो मैं आमतौर पर सीमित तारों के साथ काम नहीं करता - यह एक अच्छा प्रतिनिधित्व नहीं है जब SQL सर्वर के प्रकार डिज़ाइन किए गए हैं एकाधिक मानों के साथ काम करने के लिए।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. लिनक्स में फ्रीट कैसे स्थापित करें?

  2. SQL सर्वर में एक दृश्य कैसे बनाएं

  3. एक कॉलम को दूसरे कॉलम के मान के आधार पर अपडेट करना

  4. INSERT INTO (SQL Server 2005) का उपयोग करके कई मान डालें

  5. डेटाबेस पर खुले कनेक्शन की संख्या पाएं