﻿<?xml version='1.0' encoding='UTF-8'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>SQLServerCentral / SQL Server 2005 / T-SQL (SS2K5)  / correlated subquery / Latest Posts</title><generator>InstantForum.NET v2.9.0</generator><description>SQLServerCentral</description><link>http://www.sqlservercentral.com/Forums/</link><webMaster>notifications@sqlservercentral.com</webMaster><lastBuildDate>Wed, 22 May 2013 09:45:43 GMT</lastBuildDate><ttl>20</ttl><item><title>RE: correlated subquery</title><link>http://www.sqlservercentral.com/Forums/Topic827974-338-1.aspx</link><description>[quote][b]ezhil-649633 (12/3/2009)[/b][hr]But, i want to know whether the same can be achieved through corelated subqueries. If, yes how to achieve that?[/quote]For a finite number of levels, probably.  For an unknown number of levels, no.The recursive CTE you used has the problem of needing to recalculate the tree for whatever you're looking up every time it's used.  That's probably ok if the underlying data is changing all the time.  But, if the data is relatively static, then using "Nest Set Hierarchies" is probably the better way to go.  The queries for downlines, uplines, and hierarchical aggregations are lightning fast because of the way they're done.Here's a link for the Nest Set things... a GOOGLE of the subject will return more information on the subject that you can imagine... some of it is also pretty useless... :-P[url]http://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html[/url]If memory serves, the code isn't written for SQL Server and can stand some optimizations there.  Also (if I remember correctly), the code that converts from the Adjacency Model to the Nested Set model has a small bug in it... it always leaves off the last node.  I don't remember exactly what I did to fix it but I do remember the fix being fairly easy to find and repair.As a side bar, when I do have to do such a thing as hierarchies, I tend to embed the Nested Set model into the Adjacency Model so that I have the best of both worlds.There's a third way to do such things using a column that contains the entire "upline" path for each node.  It's also quite effective especially for stable hierarchies.  Here's some working example code for that method...[code="sql"]--=======================================================================================--      Setup some test data... note that nothing in this section is part of the actual--      solution.--=======================================================================================--===== Setup a "quiet" environment    SET NOCOUNT ON--===== Create a table to hold some test data.       -- This is NOT part of the solution CREATE TABLE #yourtable         (        ID       INT,        ParentID INT,        Descrip  VARCHAR(20)        )--===== Populate the test table with 2 "trees" of data INSERT INTO #yourtable        (ID,ParentID,Descrip) SELECT 9,NULL,'County 1'     UNION ALL --Note NULL, this is top node of "Tree 1" SELECT 2,9   ,'C1 Region 1'  UNION ALL SELECT 4,9   ,'C1 Region 2'  UNION ALL SELECT 3,2   ,'C1 R1 Unit 1' UNION ALL SELECT 5,2   ,'C1 R1 Unit 2' UNION ALL SELECT 6,4   ,'C1 R2 Unit 1' UNION ALL SELECT 7,NULL,'County 2'     UNION ALL --Note NULL, this is top node of "Tree 2" SELECT 8,7   ,'C2 Region 1'  UNION ALL SELECT 1,9   ,'C1 Region 3'--=======================================================================================--      The following code makes a Hierarchy "sister" table with strings that are used--      to traverse various hierarchies.--=======================================================================================--===== Create and seed the "Hierarchy" table on the fly SELECT ID,         ParentID,         Descrip,         Level = 0, --Top Level        HierarchyString = CAST(STR(ID,5) AS VARCHAR(8000))+' '   INTO #Hierarchy   FROM #yourtable  WHERE ParentID IS NULL--===== Declare a local variable to keep track of the current levelDECLARE @Level INT    SET @Level = 0--===== Create the hierarchy in the HierarchyString  WHILE @@ROWCOUNT &amp;gt; 0   BEGIN            SET @Level = @Level + 1         INSERT INTO #Hierarchy                (ID, ParentID, Descrip, Level, HierarchyString)         SELECT y.ID,y.ParentID,y.Descrip, @Level, h.HierarchyString + STR(y.ID,5) + ' '           FROM #yourtable y          INNER JOIN #Hierarchy h             ON y.ParentID = h.ID       --Looks for parents only            AND h.Level    = @Level - 1 --Looks for parents only    END--=======================================================================================--      Now, demo the use of the sister table--=======================================================================================--===== Display the entire tree with indented descriptions according to the Level SELECT ID,         ParentID,         Level,        LEFT(REPLICATE(' ',Level*2)+descrip,30),        HierarchyString    FROM #Hierarchy  ORDER BY HierarchyString--===== Select only the "downline" for ID 2 including ID 2 SELECT ID,         ParentID,         Level,        LEFT(REPLICATE(' ',Level*2)+descrip,30),        HierarchyString    FROM #Hierarchy  WHERE HierarchyString LIKE '% 2 %'  ORDER BY HierarchyStringdrop table #Hierarchydrop table #yourtable[/code]Obviously, you wouldn't drop the tables once created.  For relatively static tables, you'd rerun the code when rows were added, deleted, or modified.</description><pubDate>Sat, 05 Dec 2009 09:39:51 GMT</pubDate><dc:creator>Jeff Moden</dc:creator></item><item><title>RE: correlated subquery</title><link>http://www.sqlservercentral.com/Forums/Topic827974-338-1.aspx</link><description>When i run your query against my database i have got this as output.Input EID = 3Output:MID       EID       E.Name1	1	A1	2	AA1	3	AAA1	4	AAAA3	1	C3	2	CC3	3	CCCBut, i cannot able to under stand how this solution will fit for my suituation.Can you explain bit more to me.Thanks</description><pubDate>Sat, 05 Dec 2009 01:52:29 GMT</pubDate><dc:creator>ezhil-649633</dc:creator></item><item><title>RE: correlated subquery</title><link>http://www.sqlservercentral.com/Forums/Topic827974-338-1.aspx</link><description>[quote][b]ezhil-649633 (12/4/2009)[/b][hr]Is it possible to achieve the same using 'JOINS'?[/quote]Hi,try this, on inner joincreate table #temp1(MID int,EID int,ENAME varchar(10))insert into #temp1select 1,1,'A'union allselect 1,2,'AA'union allselect 1,3,'AAA'union allselect 1,4,'AAAA'union allselect 2,1,'B'union allselect 2,2,'BB'union allselect 3,1,'C'union allselect 3,2,'CC'union allselect 3,3,'CCC'select * from #temp1[code="sql"]declare @child_param intset @child_param = 3select a.* from #temp1 a inner join(select distinct MID from #temp1where EID = @child_param)as bon a.Mid= B.MID[/code]</description><pubDate>Fri, 04 Dec 2009 21:17:57 GMT</pubDate><dc:creator>arun.sas</dc:creator></item><item><title>RE: correlated subquery</title><link>http://www.sqlservercentral.com/Forums/Topic827974-338-1.aspx</link><description>Is it possible to achieve the same using 'JOINS'?</description><pubDate>Fri, 04 Dec 2009 20:45:24 GMT</pubDate><dc:creator>ezhil-649633</dc:creator></item><item><title>RE: correlated subquery</title><link>http://www.sqlservercentral.com/Forums/Topic827974-338-1.aspx</link><description>if that's the output you're expecting, then you will need to use a CTE or recursive funtion, which you have already done.</description><pubDate>Fri, 04 Dec 2009 05:51:00 GMT</pubDate><dc:creator>Mike01</dc:creator></item><item><title>RE: correlated subquery</title><link>http://www.sqlservercentral.com/Forums/Topic827974-338-1.aspx</link><description>Hi Mike,By using your query i can able to get only the immediate childs of the parent.For example when i gave 1 as input to that query, i have retrieving only the direct child of 1, in our case iam receiving 2 and 3.But i cannot able to receive all child of parent.Expecting output:Input - 1Output - 2 ,4, 3, 5</description><pubDate>Thu, 03 Dec 2009 20:40:47 GMT</pubDate><dc:creator>ezhil-649633</dc:creator></item><item><title>RE: correlated subquery</title><link>http://www.sqlservercentral.com/Forums/Topic827974-338-1.aspx</link><description>[code="sql"]select MgrID, EmpID, EmployeeName from emp ewhere MgrID in (select EmpID from emp b 	          where b.EmpID = 1)[/code]</description><pubDate>Thu, 03 Dec 2009 06:10:57 GMT</pubDate><dc:creator>Mike01</dc:creator></item><item><title>correlated subquery</title><link>http://www.sqlservercentral.com/Forums/Topic827974-338-1.aspx</link><description>Hi,I have a table in the following structureMgrID     EmpID    EmployeeName   0           1            Ezhil   1           2            Alex   1           3            Jack   2           4            Allen   3           5            RoseI want to find the child details of the particular node if specific EmpID is given.I already got the output through recursive function and also through CTE.But, i want to know whether the same can be achieved through corelated subqueries. If, yes how to achieve that?Waiting for the reply eagerly.Thanks in advance.</description><pubDate>Thu, 03 Dec 2009 00:26:36 GMT</pubDate><dc:creator>ezhil-649633</dc:creator></item></channel></rss>