Solved

Recursive SQL Stored Procedure

Posted on 2010-09-07
9
687 Views
Last Modified: 2012-08-13
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

0
Comment
Question by:markej
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 4
9 Comments
 
LVL 143

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 33618195
you are actually quite close...just make the CTE "recursive" with a UNION:http://msdn.microsoft.com/en-us/library/ms186243.aspx
0
 

Author Comment

by:markej
ID: 33618387
How do I do that? and how to I pass in the id of the item I want to work up from?
0
 
LVL 143

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 33618433
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
0
Upcoming Webinar: Securing your MySQL/MariaDB data

Join Percona’s Chief Evangelist, Colin Charles as he presents Securing your MySQL®/MariaDB® data on Tuesday, July 11, 2017 at 7:00 am PDT / 10:00 am EDT (UTC-7).

 

Author Comment

by:markej
ID: 33619567
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
0
 
LVL 143

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 33619982
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

0
 

Author Comment

by:markej
ID: 33620618
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

0
 
LVL 58

Accepted Solution

by:
cyberkiwi earned 250 total points
ID: 33625511
I think AngelIII meant this

;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 r.id = b.parentid  -- In each iteration, add b's parent, then b's b's parent etc
)
 SELECT id, parentid, Description
   FROM Breadcrumb
0
 
LVL 143

Assisted Solution

by:Guy Hengel [angelIII / a3]
Guy Hengel [angelIII / a3] earned 250 total points
ID: 33625533
oh yes... the parents ... not to show the children...
I didn't see that (too busy on job)

thanks, cyberkiwi
0
 

Author Closing Comment

by:markej
ID: 33625586
Still not quite sure how this works BUT will try and use this as an example for any further requirements
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Recently, Microsoft released a best-practice guide for securing Active Directory. It's a whopping 300+ pages long. Those of us tasked with securing our company’s databases and systems would, ideally, have time to devote to learning the ins and outs…
In part one, we reviewed the prerequisites required for installing SQL Server vNext. In this part we will explore how to install Microsoft's SQL Server on Ubuntu 16.04.
Polish reports in Access so they look terrific. Take yourself to another level. Equations, Back Color, Alternate Back Color. Write easy VBA Code. Tighten space to use less pages. Launch report from a menu, considering criteria only when it is filled…
This is a high-level webinar that covers the history of enterprise open source database use. It addresses both the advantages companies see in using open source database technologies, as well as the fears and reservations they might have. In this…

695 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question