I am using a tree control in a form, which uses columns ID, ParentID, ReasonText. eg:
ID ParentID ReasonText
1 0 Level1A
2 0 Level1B
3 1 Level2AA
4 1 Level2AB
5 2 Level2BA
6 4 Level3ABA
I want to get the structure from SQL, such that if I select ID=6 for instance I want to return "Level1A>Level2AB>Level3ABA" and 1 would return "Level1A". I have a complicated SQL statement which does it up to 4 levels.
DECLARE @ipid int = 45
DECLARE @pathdelimiter varchar = '>'
SELECT
R1.ID, N'' +
CASE WHEN (SELECT R4.ReasonText FROM CLG_CallReasonTree R4 WHERE R4.ID = (SELECT R3.ParentID FROM CLG_CallReasonTree R3 WHERE R3.ID = (SELECT R2.ParentID FROM CLG_CallReasonTree R2 WHERE R2.ID = R1.ParentID))) IS NOT NULL
THEN (SELECT R4.ReasonText FROM CLG_CallReasonTree R4 WHERE R4.ID = (SELECT R3.ParentID FROM CLG_CallReasonTree R3 WHERE R3.ID = (SELECT R2.ParentID FROM CLG_CallReasonTree R2 WHERE R2.ID = R1.ParentID))) + @pathdelimiter ELSE '' END +
CASE WHEN (SELECT R3.ReasonText FROM CLG_CallReasonTree R3 WHERE R3.ID = (SELECT R2.ParentID FROM CLG_CallReasonTree R2 WHERE R2.ID = R1.ParentID)) IS NOT NULL
THEN (SELECT R3.ReasonText FROM CLG_CallReasonTree R3 WHERE R3.ID = (SELECT R2.ParentID FROM CLG_CallReasonTree R2 WHERE R2.ID = R1.ParentID)) + @pathdelimiter ELSE '' END +
CASE WHEN (SELECT R2.ReasonText FROM CLG_CallReasonTree R2 WHERE R2.ID = R1.ParentID) IS NOT NULL
THEN (SELECT R2.ReasonText FROM CLG_CallReasonTree R2 WHERE R2.ID = R1.ParentID) + @pathdelimiter ELSE '' END +
R1.ReasonText AS TreePath
FROM CLG_CallReasonTree R1
WHERE R1.ID = @ipid
I'm sure there must be a way to do it more simply, using recursion but just can't manage it.