2014-09-01 10 views
7

ich einen binären Baum in einer SQL Server vorgestellt haben 2.014 Tabelle:Binary Suchabfrage mit Hilfe von SQL

UserID ParentUserID Position 
---------------------------- 
1  Null   Null  <-- ROOT 
2  1   Left 
3  1   Right <-- Last Right for ID=1 (CTE query return 3) 
4  2   Left 
5  4   Left 
6  5   Left 
7  6   Left  <-- Last Left for ID=1 (CTE query return 6) 

Um letzte linke ID und letzte richtige ID bekomme ich bin mit CTE-Abfrage:

; with left_hand_recurse as 
(
     select UserID 
     ,  ParentUserID 
     ,  1 as depth 
     from Table1 where ParentUserID is null 
     union all 
     select child.UserID 
     ,  child.ParentUserID 
     ,  parent.depth + 1 
     from left_hand_recurse parent 
     join Table1 child 
     on  parent.UserID = child.ParentUserID 
       and position = 'Left' 
) 
select top 1 * 
from left_hand_recurse 
order by 
     depth desc 
; 

und

; with right_hand_recurse as 
(
     select UserID 
     ,  ParentUserID 
     ,  1 as depth 
     from Table1 where ParentUserID is null 
     union all 
     select child.UserID 
     ,  child.ParentUserID 
     ,  parent.depth + 1 
     from right_hand_recurse parent 
     join Table1 child 
     on  parent.UserID = child.ParentUserID 
       and position = 'Right' 
) 
select top 1 * 
from right_hand_recurse 
order by 
     depth desc 
; 

Es funktioniert gut. Auf diese Weise kann ich die letzten UserID in der linken oder rechten Seite für root bekommen (für ParentUserID == 1)

Ich brauche die CTE-Abfrage zu modifizieren gleiches Ergebnis zu erhalten, aber für bestimmte ParentUserID, die ich als Parameter @ParentUserID geben will.

Wie wird dieses Ziel erreicht?

Antwort

2

einfach diese Zeile in jedem CTE ändern:

from Table1 where ParentUserID is null 

zu:

from Table1 where ParentUserID = @ParentId 
+1

würde es weiter erklären, warum die eher als die ursprüngliche Version funktioniert? –

+0

Ich habe versucht, nicht richtig funktioniert. Wenn ich in der Tabelle keinen Wert "Right" habe, gibt die Abfrage mich LastRight für diese Position zurück. –