Avatar of markej
markejFlag for United Kingdom of Great Britain and Northern Ireland

asked on 

Recursive SQL Stored Procedure

I have a hierarchal data structure and the attached code will show a list of all the items linked to their parent. However I want to be able to 'walk' up the table as I will know the id I'm att BUT need to know the id's of it's parent etc upto the root.

Can someone help or explain how to do this. Thanks!
With Breadcrumb( id, parentid, description) as
(
	SELECT id, parentid, Description
	FROM   RadMenu
	--where  parentid IS NOT NULL
)
select parentid, id, description
from breadcrumb
order by parentid

Here's some of the data, filtered to show 1 example:

id      parentid Description
57	NULL	Adaptors
74	57	CompactFlash to IDE
75	57	CompactFlash to SATA
76	57	PCMCIA to CompactFlash
978	57	CFast to SATA
275	74	IDE to 1 CompactFlash Slot 
525	74	IDE to 2 CompactFlash Slots
555	74	IDE to 1 CompactFlash Slot

Open in new window

Microsoft SQL ServerDatabases.NET Programming

Avatar of undefined
Last Comment
markej
Avatar of Guy Hengel [angelIII / a3]
Guy Hengel [angelIII / a3]
Flag of Luxembourg image

you are actually quite close...just make the CTE "recursive" with a UNION:http://msdn.microsoft.com/en-us/library/ms186243.aspx
Avatar of markej
markej
Flag of United Kingdom of Great Britain and Northern Ireland image

ASKER

How do I do that? and how to I pass in the id of the item I want to work up from?
did you check out the link I posted?
once you learned how to do it, you will remember it very easily ...

the trick is to "UNION" within the WITH ....

the first select in that union gives the "starting point", you have to give the condition which rows to check first.
the second select in that union joins to the CTE itself, so that has to return records based on the "parent records" returned by the first query ... and that does the recursive stuff.

if really you don't get it, post the query you get, and I will then fix it up for you
Avatar of markej
markej
Flag of United Kingdom of Great Britain and Northern Ireland image

ASKER

This gives me just the value for the id I supplied:

WITH Breadcrumb AS (
                                    SELECT id, parentid, Description
                                    FROM RadMenu
                               UNION ALL
                                    SELECT id, parentid, Description
                                    FROM RadMenu AS RadMenu_1)
                     -- WHERE        (parentid IS NOT NULL))
                                    SELECT id, parentid, Description
                                    FROM Breadcrumb AS Breadcrumb_1
                                    WHERE (id = @id)
                                    ORDER BY parentid

id, parentid, Description
806      650      APRO Hermes Series R:105MB/s & W:100MB/s
806      650      APRO Hermes Series R:105MB/s & W:100MB/s

While this

WITH Breadcrumb AS (
                                    SELECT id, parentid, Description
                                    FROM RadMenu
                                    WHERE (id = @id)
                              UNION ALL
                                    SELECT id, parentid, Description
                                    FROM RadMenu AS RadMenu_1)
                                    SELECT id, parentid, Description
                                    FROM Breadcrumb AS Breadcrumb_1
                                    ORDER BY parentid

Gives over 400 records, and it looks like it's returning all the rows in the database.

I can't see how to join it so it returns just the hierarchy of the id selected.

Mark
here we go:
WITH Breadcrumb AS (
   SELECT id, parentid, Description 
     FROM RadMenu
    WHERE id = @id
  UNION ALL
  SELECT r.id, r.parentid, r.Description 
    FROM RadMenu r
    -- here starts the "trick"
    JOIN Breadcrumb b 
      ON b.id = r.parentid
)
 SELECT id, parentid, Description
   FROM Breadcrumb 

Open in new window

Avatar of markej
markej
Flag of United Kingdom of Great Britain and Northern Ireland image

ASKER

Thanks for that unfortunatly it just returns one row, I pass in an id of 806 and get


id, parentid, description
806      650      APRO Hermes Series R:105MB/s & W:100MB/s

rather than

id, parentid, description
806      650      APRO Hermes Series R:105MB/s & W:100MB/s
650      648      Standard Temp (0°C ~ 70°C)
648      646      Industrial Grade (SLC)
646      NULL      CFast (1.0" SSD)

Where id 646 is the root record

ASKER CERTIFIED SOLUTION
Avatar of cyberkiwi
cyberkiwi
Flag of New Zealand image

Blurred text
THIS SOLUTION IS ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
SOLUTION
THIS SOLUTION IS ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
Avatar of markej
markej
Flag of United Kingdom of Great Britain and Northern Ireland image

ASKER

Still not quite sure how this works BUT will try and use this as an example for any further requirements
Microsoft SQL Server
Microsoft SQL Server

Microsoft SQL Server is a suite of relational database management system (RDBMS) products providing multi-user database access functionality.SQL Server is available in multiple versions, typically identified by release year, and versions are subdivided into editions to distinguish between product functionality. Component services include integration (SSIS), reporting (SSRS), analysis (SSAS), data quality, master data, T-SQL and performance tuning.

171K
Questions
--
Followers
--
Top Experts
Get a personalized solution from industry experts
Ask the experts
Read over 600 more reviews

TRUSTED BY

IBM logoIntel logoMicrosoft logoUbisoft logoSAP logo
Qualcomm logoCitrix Systems logoWorkday logoErnst & Young logo
High performer badgeUsers love us badge
LinkedIn logoFacebook logoX logoInstagram logoTikTok logoYouTube logo