Depth Travesal

Please support our MS SQL advertiser: Intel Parallel Studio Home
Reply

Join Date: Mar 2008
Posts: 2
Reputation: snow00 is an unknown quantity at this point 
Solved Threads: 0
snow00 snow00 is offline Offline
Newbie Poster

Depth Travesal

 
0
  #1
Mar 17th, 2008
Hi, I am a newbie for MSSQL. Previously, I was given a question regarding MSSQL. Although the interview had over, but I am curious to find out on how to solve the question below:

There are 2 tables, NAMES (ID INT IDENTITY(1,1), NAME SYSNAME) and
RELATIONSHIPS (NAMEID INT, PARENT_NAMEID INT) linked via NAMES.ID=
RELANTIONSHIP.NAMEID and where top-most name has a PARENT_NAMEID=0.
Show a nested list of names including LEVEL, NAMEID and NAME, where
LEVEL indicates the nest level (or depth) from top. You may use functions,
stored procedures,views and any other Transact SQL commands compliant
with Microsoft SQL 2000.


Sample Data:
NAMES table content
ID NAME
1 Frank
2 Jo
3 Mary
4 Peter
5 Amy


RELATIONSHIPS table content

NAMEID PARENT_NAMEID
1 0
2 1
3 2
4 1
5 2


Expected Output

LEVEL ID NAME
0 1 Frank
1 2 Jo
2 5 Amy
2 3 Mary
1 4 Peter

Thanks in advanced
Reply With Quote Quick reply to this message  
Join Date: Feb 2008
Posts: 42
Reputation: huangzhi is an unknown quantity at this point 
Solved Threads: 13
huangzhi huangzhi is offline Offline
Light Poster

Re: Depth Travesal

 
0
  #2
Mar 20th, 2008
Try this code in Query Analyser. It enough for small data. If you want to use for big data, modify the code.

  1. SET nocount ON
  2. CREATE TABLE #tmpName (ID int, [Name] varchar(255))
  3. CREATE TABLE #tmpRelation (ID int, ID_Parent int)
  4.  
  5. INSERT #tmpName (ID, [Name]) select 1, 'Frank'
  6. INSERT #tmpName (ID, [Name]) select 2, 'Jo'
  7. INSERT #tmpName (ID, [Name]) select 3, 'Mary'
  8. INSERT #tmpName (ID, [Name]) select 4, 'Peter'
  9. INSERT #tmpName (ID, [Name]) select 5, 'Amy'
  10.  
  11. INSERT #tmpRelation (ID, ID_Parent) select 1, 0
  12. INSERT #tmpRelation (ID, ID_Parent) select 2, 1
  13. INSERT #tmpRelation (ID, ID_Parent) select 3, 2
  14. INSERT #tmpRelation (ID, ID_Parent) select 4, 1
  15. INSERT #tmpRelation (ID, ID_Parent) select 5, 2
  16.  
  17. CREATE TABLE #tmpResult (ID int, ID_Parent int, [Level] int, [Name] varchar(255))
  18.  
  19. INSERT #tmpResult (ID, ID_Parent, [Level], [Name])
  20. SELECT N.ID, R.ID_Parent, 0, N.[Name]
  21. FROM #tmpName N inner join #tmpRelation R on
  22. N.ID = R.ID
  23. WHERE ID_Parent = 0
  24.  
  25. while EXISTS (SELECT 1 FROM #tmpName N left join #tmpResult R on N.ID = R.ID where R.ID is null)
  26. begin
  27. INSERT #tmpResult (ID, ID_Parent, [Level], [Name])
  28. SELECT N.ID, R.ID_Parent, C.[Level] + 1, N.[Name]
  29. FROM #tmpName N inner join #tmpRelation R on
  30. N.ID = R.ID INNER JOIN (
  31. SELECT P.ID, P.[Level]
  32. FROM #tmpResult P left join #tmpResult C on
  33. P.ID = C.ID_Parent
  34. WHERE C.ID IS NULL
  35. ) C ON
  36. R.ID_Parent = C.ID
  37. end
  38.  
  39. SELECT ID, [Level], Name FROM #tmpResult
  40.  
  41. DROP TABLE #tmpResult
  42. DROP TABLE #tmpName
  43. DROP TABLE #tmpRelation
Hence Wijaya
www.ex-Soft.tk
Reply With Quote Quick reply to this message  
Join Date: Mar 2008
Posts: 2
Reputation: snow00 is an unknown quantity at this point 
Solved Threads: 0
snow00 snow00 is offline Offline
Newbie Poster

Re: Depth Travesal

 
0
  #3
Mar 23rd, 2008
Thanks Huangzi, will test it later. Thanks again for the solution you offer.
Reply With Quote Quick reply to this message  
Reply

This thread is more than three months old.
Perhaps start a new thread instead?
Message:


Thread Tools Search this Thread



Tag cloud for MS SQL
About Us | Contact Us | Advertise | DaniWeb | Acceptable Use Policy | RSS Feed

©2003 - 2009 DaniWeb® LLC