SQL Queries to Manage Hierarchical or Parent-child Relational Rows in SQL Server - CodeProject

Published on January 2017 | Categories: Documents | Downloads: 43 | Comments: 0 | Views: 382
of 8
Download PDF   Embed   Report

Comments

Content

SQL queries to manage hierarchical or parent-child relational rows in SQ...

1 of 8

http://www.codeproject.com/Articles/818694/SQL-queries-to-manage-hi...

Articles » Database » Database » SQL

SQL queries to manage hierarchical or
parent-child relational rows in SQL Server
DiponRoy, 15 Sep 2014

CPOL

4.86 (23 votes)
Some queries to find generation of each row, all possible children’s, all possible parents, managing
recursion

Download ParentChildHierarchy_15_Sep_2014_V2.zip - 35.7 KB

Introduction
Here in this post we will try to manage data’s with hierarchical relation or parent-child relation of a
specific table in SQL server. Our special concentration would be over,
Show Generations of each row
Find all possible parents of a specific row
Find all possible child’s of a specific row
Show all possible parents at a column with a separator
Show all possible child’s at a column with a separator

Background
Let’s pretend
A row can have only one parent or Null as no parent
There is at least a row, without parent (parentId is null)
And at least a row, without any child
Here is our table schema.
/*drop the tbl*/
--DROP TABLE UserType
/*create the tbl*/
CREATE TABLE UserType(
Id BIGINT NOT NULL,

6/11/2015 12:55 AM

SQL queries to manage hierarchical or parent-child relational rows in SQ...

2 of 8

http://www.codeproject.com/Articles/818694/SQL-queries-to-manage-hi...

Name VARCHAR(100) NOT NULL,
ParentId BIGINT NULL
)
Let’s populate the table with data’s
/*insert data into table*/
DECLARE @maxCount BIGINT,
@count BIGINT,
@parentId BIGINT;
SET @maxCount = 10;
/*change to input more*/
SET @count = 1;
WHILE @count <= @maxCount
BEGIN
If @count = 1
SET @parentId = NULL;
ELSE
SET @parentId = @count - 1;
INSERT INTO UserType(Id, Name, ParentId)
VALUES (@count, 'User_' + CONVERT(VARCHAR(400), @count), @parentId)
SET @count = @count + 1;
END
So our populated table would be like
/*show inserted datas*/
SELECT *
FROM UserType;

Check in live http://www.sqlfiddle.com/#!3/f50a6/1
Now how to find all this generations, parents or child’s using SQL for a specific row …!!!
The answer is using recursion. But to use this recursion we need some Thing Called CTE (Common
Table Expressions) or in syntax “WITH” in SQL. If we don’t have any idea about it, we can start with
the links or Google for few moments.
http://msdn.microsoft.com/en-us/library/ms175972.aspx
http://technet.microsoft.com/en-us/library/ms190766%28v=sql.105%29.aspx
http://www.codeproject.com/Articles/265371/Common-Table-Expressions-CTE-in-SQL-SERVER
So let’s start with pretty basics.

6/11/2015 12:55 AM

SQL queries to manage hierarchical or parent-child relational rows in SQ...

3 of 8

http://www.codeproject.com/Articles/818694/SQL-queries-to-manage-hi...

Regular Join
Joining table with itself based on condition, where ones parentId is equal to another’s Id
/*regular join to get detail*/
SELECT ChildUserType.Id, ChildUserType.Name, ParentUserType.Id,
ParentUserType.Name
FROM UserType AS ChildUserType
LEFT JOIN UserType AS ParentUserType ON ChildUserType.ParentId =
ParentUserType.Id;

Check in live http://www.sqlfiddle.com/#!3/f50a6/2

Row Generation
The procedure is something like
All rows with no parent (NULL), assign generation 0 to them
Find rows where parent belongs to the generation 0, and assign increased generation to itself
Do until the recursion is finished.
/*row generations*/
WITH Hierarchy(ChildId, ChildName, Generation, ParentId)
AS
(
SELECT Id, Name, 0, ParentId
FROM UserType AS FirtGeneration
WHERE ParentId IS NULL
UNION ALL
SELECT NextGeneration.Id, NextGeneration.Name, Parent.Generation + 1,
Parent.ChildId
FROM UserType AS NextGeneration
INNER JOIN Hierarchy AS Parent ON NextGeneration.ParentId =
Parent.ChildId
)
SELECT *
FROM Hierarchy
OPTION(MAXRECURSION 32767)

6/11/2015 12:55 AM

SQL queries to manage hierarchical or parent-child relational rows in SQ...

4 of 8

http://www.codeproject.com/Articles/818694/SQL-queries-to-manage-hi...

Check in live http://www.sqlfiddle.com/#!3/f50a6/3

All Possible Parents
check http://stackoverflow.com/a/21233413/2948523
Here we are trying to find all possible parents of a row where it's Id = 5
Starts with selecting the row where Id = 5
Find other rows where its id is equal to previously selected’s ParentId
And continue reduction
--all posible parents of @id
DECLARE @id BIGINT;
SET @id = 5;
WITH tblParent AS
(
SELECT *
FROM UserType WHERE Id = @id
UNION ALL
SELECT UserType.*
FROM UserType JOIN tblParent
)
SELECT * FROM tblParent
WHERE Id <> @id
OPTION(MAXRECURSION 32767)

ON UserType.Id = tblParent.ParentId

Check in live http://www.sqlfiddle.com/#!3/f50a6/5

All Possible Childs
check http://stackoverflow.com/a/21233413/2948523
Here we are trying to find all possible child’s of a row where it’s Id = 5

6/11/2015 12:55 AM

SQL queries to manage hierarchical or parent-child relational rows in SQ...

5 of 8

http://www.codeproject.com/Articles/818694/SQL-queries-to-manage-hi...

Starts with selecting the row where Id = 5
Find other rows where its ParentId is equal to previously selected’s Id
And continue reduction
-- all posible childs of @userTypeId
DECLARE @userTypeId BIGINT;
SET @userTypeId = 5;
WITH tblChild AS
(
SELECT *
FROM UserType WHERE ParentId = @userTypeId
UNION ALL
SELECT UserType.* FROM UserType JOIN tblChild
tblChild.Id
)
SELECT *
FROM tblChild
OPTION(MAXRECURSION 32767)

ON UserType.ParentId =

Check in live http://www.sqlfiddle.com/#!3/f50a6/6

All Possible Parents In A Column
Here we are showing all the possible parents Ids at the column with a specific separator ‘.’
/*row posible parents in a column*/
WITH Hierarchy(ChildId, ChildName, ParentId, Parents)
AS
(
SELECT Id, Name, ParentId, CAST('' AS VARCHAR(MAX))
FROM UserType AS FirtGeneration
WHERE ParentId IS NULL
UNION ALL
SELECT NextGeneration.Id, NextGeneration.Name, Parent.ChildId,
CAST(CASE WHEN Parent.Parents = ''
THEN(CAST(NextGeneration.ParentId AS VARCHAR(MAX)))
ELSE(Parent.Parents + '.' + CAST(NextGeneration.ParentId AS
VARCHAR(MAX)))
END AS VARCHAR(MAX))
FROM UserType AS NextGeneration
INNER JOIN Hierarchy AS Parent ON NextGeneration.ParentId =
Parent.ChildId
)
SELECT *
FROM Hierarchy
OPTION(MAXRECURSION 32767)

6/11/2015 12:55 AM

SQL queries to manage hierarchical or parent-child relational rows in SQ...

6 of 8

http://www.codeproject.com/Articles/818694/SQL-queries-to-manage-hi...

Check in live http://www.sqlfiddle.com/#!3/f50a6/7

All Possible Childs In A Column
Here we are showing all the possible child’s Ids at the column with a specific separator ‘.’
/*row posible childs in a column*/
WITH Hierarchy(ChildId, ChildName, ParentId, Childs)
AS
(
SELECT Id, Name, ParentId, CAST('' AS VARCHAR(MAX))
FROM UserType AS LastGeneration
WHERE Id NOT IN (SELECT COALESCE(ParentId, 0) FROM UserType)
UNION ALL
SELECT PrevGeneration.Id, PrevGeneration.Name, PrevGeneration.ParentId,
CAST(CASE WHEN Child.Childs = ''
THEN(CAST(Child.ChildId AS VARCHAR(MAX)))
ELSE(Child.Childs + '.' + CAST(Child.ChildId AS VARCHAR(MAX)))
END AS VARCHAR(MAX))
FROM UserType AS PrevGeneration
INNER JOIN Hierarchy AS Child ON PrevGeneration.Id =
Child.ParentId
)
SELECT *
FROM Hierarchy
OPTION(MAXRECURSION 32767)

Check in live http://www.sqlfiddle.com/#!3/f50a6/8

6/11/2015 12:55 AM

SQL queries to manage hierarchical or parent-child relational rows in SQ...

7 of 8

http://www.codeproject.com/Articles/818694/SQL-queries-to-manage-hi...

Recursion limit !!!
In all of the previous queries we have used syntax like
OPTION(MAXRECURSION 32767)
This specifies the maximum number of recursions in CTE. Now if we don’t use this
OPTION(MAXRECURSION 32767) , by default it is 100.
We need to specify this number depending on the recursion requirement.

If More Recursion Needed !!!
To increase the recursion number, excluding CTE’s maximum Limit. We can follow some instruction
like the links, or Google for some time.
http://www.sql-server-helper.com/error-messages/msg-310.aspx
http://stackoverflow.com/questions/15080922/infinite-loop-cte-with-option-maxrecursion-0

Limitations
Yes, there could be something which I misunderstood or presented. So if you find anything, just let
me know.
Find the SQL file at the attachment.

License
This article, along with any associated source code and files, is licensed under The Code Project Open
License (CPOL)

Share
About the Author

6/11/2015 12:55 AM

SQL queries to manage hierarchical or parent-child relational rows in SQ...

8 of 8

http://www.codeproject.com/Articles/818694/SQL-queries-to-manage-hi...

DiponRoy
Bangladesh
No Biography provided

You may also be interested in...
Populating DataGrid
control from a
parent-child
relationship DB
table

Requirements
Management for the
Internet of Things

Parent/Child
(Hierarchical)
Relational Treeview
User Control
Development in
ASP.NET

SAPrefs Netscape-like
Preferences Dialog

SQL Server CE Query
Tool

XNA Snooker Club

Comments and Discussions
14 messages have been posted for this article Visit http://www.codeproject.com/Articles
/818694/SQL-queries-to-manage-hierarchical-or-parent-child to post and view comments on
this article, or click here to get a print view with messages.
Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.151103.1 | Last Updated 16 Sep 2014

Select Language ▼

Article Copyright 2014 by DiponRoy
Everything else Copyright © CodeProject, 1999-2015

6/11/2015 12:55 AM

Sponsor Documents

Or use your account on DocShare.tips

Hide

Forgot your password?

Or register your new account on DocShare.tips

Hide

Lost your password? Please enter your email address. You will receive a link to create a new password.

Back to log-in

Close