--Table DDLCreate Table #Hierarchy ( [OUID] [int] Primary Key, [OUParentID] [int] NULL, [CustomerID] [int] NOT NULL, [Enabled] [bit] NULL, [Hierarchy] [varchar](256) NULL, )--Sample Insert of 26 rowsSELECT '364',NULL,'14','1','364' UNION ALLSELECT '365','364','14','1','364.365' UNION ALLSELECT '366','365','14','1','364.365.366' UNION ALLSELECT '367','366','14','1','364.365.366.367' UNION ALLSELECT '368','367','14','1','364.365.366.367.368' UNION ALLSELECT '369','367','14','1','364.365.366.367.369' UNION ALLSELECT '370','367','14','1','364.365.366.367.370' UNION ALLSELECT '371','364','14','1','364.371' UNION ALLSELECT '372','371','14','1','364.371.372' UNION ALLSELECT '373','372','14','1','364.371.372.373' UNION ALLSELECT '374','373','14','1','364.371.372.373.374' UNION ALLSELECT '375','374','14','1','364.371.372.373.374.375' UNION ALLSELECT '376','372','14','1','364.371.372.376' UNION ALLSELECT '377','376','14','1','364.371.372.376.377' UNION ALLSELECT '378','377','14','1','364.371.372.376.377.378' UNION ALLSELECT '379','372','14','1','364.371.372.379' UNION ALLSELECT '380','379','14','1','364.371.372.379.380' UNION ALLSELECT '381','380','14','1','364.371.372.379.380.381' UNION ALLSELECT '382','372','14','1','364.371.372.382' UNION ALLSELECT '383','382','14','1','364.371.372.382.383' UNION ALLSELECT '384','383','14','1','364.371.372.382.383.384' UNION ALLSELECT '385','372','14','1','364.371.372.385' UNION ALLSELECT '386','385','14','1','364.371.372.385.386' UNION ALLSELECT '387','386','14','1','364.371.372.385.386.387' UNION ALLSELECT '388','372','14','1','364.371.372.388' UNION ALLSELECT '389','388','14','1','364.371.372.388.389'--Original Query ApproachDECLARE @pCustomerID int, @pUserID int, @pOUIDs varchar(max), @pLocationIds varchar(max)SET @pCustomerID = 14SET @pUserID = 1SET @pOUIDs = NULLSET @pLocationIDs = NULLSELECT DISTINCT ou.OUID FROM (SELECT ouChild.OUID, ouChild.CustomerID, ouChild.Enabled, ou.OUID as OUIDAncestor FROM #Hierarchy ou INNER JOIN #Hierarchy ouChild ON ouChild.Hierarchy + '.' LIKE ou.Hierarchy + '.%' )ou WHERE ou.CustomerID = @pCustomerID AND ou.Enabled = 1 AND ( @pOUIDs IS NULL OR @pOUIDs LIKE '%,' + CAST(OUIDAncestor AS VARCHAR(20)) + ',%' );-- CTE ApproachWITH LocationHierarchy As ( SELECT ouf.OUID,ouf.OUParentID,ouf.CustomerID,ouf.Hierarchy,ouf.Enabled FROM #Hierarchy ouf Where OUID in (select Value from dbo.SplitString(@pOUIDs,',')) or @pOUIDs is null UNION ALL SELECT ouc.OUID,ouc.OUParentID,ouc.CustomerID,ouc.Hierarchy,ouc.Enabled FROM #Hierarchy ouc INNER JOIN LocationHierarchy on ouc.OUParentID = LocationHierarchy.OUID Where ouc.Enabled = 1 and ouc.CustomerID = @pCustomerID ) Select DISTINCT ou.OUID from LocationHierarchy ou
;with BadAdj ( KeyVal, SomeVal, ParentKeyVal, AwfulPath)as( select 1, 'Top Dog', null, '1' union all select 2, 'Next Dog', 1, '1.2' union all select 3, 'Grandchild', 2, '1.2.3' union all select 4, 'Uber Grandchild', 3, '1.2.3.4' union all select 5, 'Step Grandchild', 4, '1.2.3.4.5')select * from BadAdj
SELECT stChild.OUID, stChild.OUParentID, stChild.CustomerID, stChild.Name, stChild.NameFull, stChild.Hierarchy, stChild.HierarchyDepth, stChild.Enabled, st.OUID as OUIDAncestorFROM SomeTable st INNER JOIN SomeTable stChild ON stChild.Hierarchy + '.' LIKE st.Hierarchy + '.%'
ALTER FUNCTION [dbo].[SplitString]( @String VARCHAR(MAX), @Delimeter Char(1)) RETURNS @RtnValue TABLE( Value VARCHAR(100)) AS BEGIN DECLARE @Cnt INT SET @Cnt = 1 WHILE (CHARINDEX(@Delimeter, @String) > 0) BEGIN INSERT INTO @RtnValue (Value) SELECT Data = ltrim(rtrim(Substring(@String,1,Charindex(@Delimeter,@String)-1))) SET @String = Substring(@String,Charindex(@Delimeter,@String)+1,len(@String)) SET @Cnt = @Cnt + 1 END INSERT INTO @RtnValue (Value) SELECT Data = ltrim(rtrim(@String)) RETURNEND