Solved

SQL Server - Heirarchy Question

Posted on 2009-04-08
10
161 Views
Last Modified: 2012-05-06
Hello all,

I have a table called "Customer" and this table has a few fields CustID and CustParentID, I need to pull together the heirarchy of the parent and child customers based on a passed custid, if the custparentid is null then it is a top level parent for example:

CustID         CustParentID
123             NULL
234             123
345             234
456             345
789             456

Now I may pass to a proc custif 345.   I want a resultset the best way I can get it to show the display order I am going to show the results of the parent and childs so maybe something returned such as:

CustID        RelationshipOrder      
123            1
234            2
345            3
456            4
789            5

Can anyone help the best way I can do this, or a better way possibly?  

Thanks
0
Comment
Question by:sbornstein2
  • 7
  • 3
10 Comments
 
LVL 60

Accepted Solution

by:
chapmandew earned 500 total points
ID: 24101676
here is one way to do it:

with mycte(custid, custparentid, ordering)
as
(
select custid, custparentid, 1
from #temp
where custparentid is null
union all
select t.custid, t.custparentid , ordering + 1
from #temp t
join mycte c on t.custparentid = c.custid
)

select custid,*  from mycte o
where exists(select 1 from mycte i where custid = 234)
0
 
LVL 60

Expert Comment

by:chapmandew
ID: 24101680
here's the data I loaded:

create table #temp(custid int, custparentid int)

insert into #temp
select 123     ,        NULL
union all
select 234      ,       123
union all
select 345     ,        234
union all
select 456     ,        345
union all
select 789     ,        456
0
 

Author Comment

by:sbornstein2
ID: 24106341
can't this somehow be done in one query or a nested query?  I am testing this now
0
 

Author Comment

by:sbornstein2
ID: 24106346
this is perfect though and works great, thank you.
0
 
LVL 60

Expert Comment

by:chapmandew
ID: 24106366
glad to help!
0
Comprehensive Backup Solutions for Microsoft

Acronis protects the complete Microsoft technology stack: Windows Server, Windows PC, laptop and Surface data; Microsoft business applications; Microsoft Hyper-V; Azure VMs; Microsoft Windows Server 2016; Microsoft Exchange 2016 and SQL Server 2016.

 

Author Comment

by:sbornstein2
ID: 24106471
actually this won't work only in a perfect situation.  Here is what I had in my test table now.

PartyID          PartyName                        PartyParentID
1      Company ABC      NULL
2      Company DEF      1
3      Company GHI      2
4      Company JKL      3
5      Company MNO      4
6      Jack in the Box 2      7
7      Jack in the Box 1      NULL
8      Jack in the Box 3      1
9      Jack in the Box 4      8
10      Jack in the Box 5      8

You can see now there can be more than one child flowing into a parent or another child for that matter.  So here was my results when passing in 3 as the partyid:

PartyID          PartyName                         PartyParentID   Ordering
1      Company ABC      NULL      1
7      Jack in the Box 1      NULL      1
6      Jack in the Box 2      7      2
2      Company DEF      1      2
8      Jack in the Box 3      1      2
9      Jack in the Box 4      8      3
10      Jack in the Box 5      8      3
3      Company GHI      2      3
4      Company JKL      3      4
5      Company MNO      4      5
0
 

Author Comment

by:sbornstein2
ID: 24106489
i would only want to show the flow up to the parent if I passed in partyid 3, right now this shows all the records.

with mycte(PartyID, OrgName, MacNum, PartyParentID, ordering)
as
(
select PartyID, OrgName, MacNum, PartyParentID, 1
from Organization
where PartyParentID is null
union all
select t.PartyID, t.OrgName, t.MacNum, t.PartyParentID,
       ordering + 1
from Organization t
join mycte c on t.PartyParentID = c.PartyID
)

select PartyID,*  from mycte o
where exists(select 1 from mycte i where PartyID = 3)
0
 

Author Comment

by:sbornstein2
ID: 24106494
ignore the macnum field in that above
0
 

Author Comment

by:sbornstein2
ID: 24106507
one thing is I am not sure what ordering would be right if more than one company had the same parent.  I need to find that out.
0
 

Author Comment

by:sbornstein2
ID: 24106671
i guess for now is there a way to do this and just order them based on the order of the partyid ascending I guess if there is more than one with the same parent?  Just a thought
0

Featured Post

What is SQL Server and how does it work?

The purpose of this paper is to provide you background on SQL Server. It’s your self-study guide for learning fundamentals. It includes both the history of SQL and its technical basics. Concepts and definitions will form the solid foundation of your future DBA expertise.

Question has a verified solution.

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

Introduction: When running hybrid database environments, you often need to query some data from a remote db of any type, while being connected to your MS SQL Server database. Problems start when you try to combine that with some "user input" pass…
Use this article to create a batch file to backup a Microsoft SQL Server database to a Windows folder.  The folder can be on the local hard drive or on a network share.  This batch file will query the SQL server to get the current date & time and wi…
This Micro Tutorial hows how you can integrate  Mac OSX to a Windows Active Directory Domain. Apple has made it easy to allow users to bind their macs to a windows domain with relative ease. The following video show how to bind OSX Mavericks to …
Learn how to create flexible layouts using relative units in CSS.  New relative units added in CSS3 include vw(viewports width), vh(viewports height), vmin(minimum of viewports height and width), and vmax (maximum of viewports height and width).

910 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

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now