2017-06-01 1 views
3

Wie können Sie alle möglichen Eltern- und Kinderzeilen mit einer bestimmten ID identifizieren?Möchten Sie alle möglichen übergeordneten und untergeordneten Zeilen mit spezifischer ID kennen?

z.B. haben folgende Tabelle:

MyTable:

----------------------------------------------------- 
| Id | PId | Description    | 
----------------------------------------------------- 
| 1 | NULL | A is Parent    | 
| 2 |  1  | B is Child of A   | 
| 3 |  2  | C is Child of B   | 
| 4 | NULL | D is Parent    | 
| 5 | NULL | E is Parent    | 
| 6 |  5  | F is Child of E   | 
----------------------------------------------------- 

wollen alle möglichen Eltern und Kind wissen, wann Pass spesific id

z.B.

CASE-01:

Wenn @ MyLookupId = 2 OR @ MyLookupId = 1 OR @ MyLookupId = 3 Einer von ihnen sollte einem Ergebnis führen,

------- 
| Id | 
------- 
| 1 | 
| 2 | 
| 3 | 
------- 

CASE-02:

Wenn @ MyLookupId = 4 dann Ergebnis Sollte

------- 
| Id | 
------- 
| 4 | 
------- 

CASE-03:

Wenn @ MyLookupId = 6 Dann sollte Ergebnis sein,

Hier

ist SQL für die Tabelle:

IF OBJECT_ID('tempdb.dbo.#MyTable', 'U') IS NOT NULL DROP TABLE #MyTable; 
SELECT * INTO #MyTable FROM (
    SELECT (1)Id, (NULL)PId, ('A IS Parent')Description UNION ALL 
    SELECT (2)Id, (1)PId, ('B IS Child of A')Description UNION ALL 
    SELECT (3)Id, (2)PId, ('C IS Child of B')Description UNION ALL 
    SELECT (4)Id, (NULL)PId, ('D IS Parent')Description UNION ALL 
    SELECT (5)Id, (NULL)PId, ('E IS Parent')Description UNION ALL 
    SELECT (6)Id, (5)PId, ('F IS Child of E')Description) AS tmp 

SELECT * FROM #MyTable 
+0

Wo gibt es 1 Kind von ' 6 'sagen '7'. Jetzt für lookupid = 5, willst du auch dieses Kind? – Utsav

+0

5 ist Eltern und 6 ist ein Kind von 5 ja ja beide sollten im Ergebnis sein. – Haseeb

+0

Verwenden Sie CTE mit Ebenen zur Position zu identifizieren ... es gibt eine Reihe von CTE Fälle hier oder die grundlegende CTE – maSTAShuFu

Antwort

1

Die Antwort von TRIV funktioniert, aber ein erfordert Berechnung der gesamten Hierarchie Ihrer Quellentabelle jedes Mal th Es wird eine Abfrage ausgeführt, die in einem größeren Maßstab möglicherweise nicht gut funktioniert.

Ein schmaler Ansatz ist es, die Eltern-Kind-Datensätze zu finden, die sich nur auf die ID beziehen Sie suchen:

declare @t table(ID int, PID int); 
insert into @t values(1,null),(2,1),(3,2),(4,null),(5,null),(6,5); 

declare @ID int = 2; 

with c as 
(
    select ID 
      ,PID 
    from @t 
    where ID = @ID 

    union all 

    select t.ID 
      ,t.PID 
    from @t t 
     join c 
      on(t.PID = c.ID) 
) 
,p as 
(
    select ID 
      ,PID 
    from @t 
    where ID = @ID 

    union all 

    select t.ID 
      ,t.PID 
    from @t t 
     join p 
      on(t.ID = p.PID) 
) 
select ID 
from p 

union all 

select ID 
from c 
where c.ID <> @ID 
order by ID; 

Ausgang:

ID 
```` 
1 
2 
3 
+0

arbeiten schnell Vergleichen TriV sql +1 – Haseeb

2

könnten Sie verwenden recursive cte

-- temp returns full tree of each rootId (parentid = null) 
;WITH temp AS 
(
    SELECT sd.Id, sd.PId, sd.Id AS RootId 
    FROM #MyTable sd 
    WHERE sd.PId IS NULL 

    UNION ALL 

    SELECT sd.Id, sd.PId, t.RootId 
    FROM temp t 
    INNER JOIN #MyTable sd ON t.Id = sd.PId 
) 

SELECT t2.Id 
FROM temp t 
INNER JOIN temp t2 ON t2.RootId = t.RootId 
WHERE t.Id = @Id 
OPTION (MAXRECURSION 0) 

Link Demo: http://rextester.com/RAITMT72805

+0

danke !!! Funktioniert gut – Haseeb

+0

@Haseeb Stellen Sie sicher, dass Sie die Leistung für Ihr Dataset testen, da eine vollständige Baumberechnung erforderlich ist - auch für ID-Werte, nach denen Sie nicht suchen -, bevor die relevanten Ergebnisse gelöscht werden können. Diese Menge an redundanter Rekursion über eine große Anzahl von Werten kann einen signifikanten, unnötigen Overhead haben. – iamdave

+0

@iamdave danke für den Rat Ich muss es auf eine große Anzahl von Zeilen anwenden, also lassen Sie mich überprüfen und werde meine Kommentare hier ... auch danke für Ihre großartige Antwort !!! – Haseeb

Verwandte Themen