Sql server MSSQL CTE树与过滤器如何连接?
有一个表描述了对象层次结构及其类型:Sql server MSSQL CTE树与过滤器如何连接?,sql-server,filter,tree,common-table-expression,Sql Server,Filter,Tree,Common Table Expression,有一个表描述了对象层次结构及其类型: DECLARE @TTable TABLE ( ID int ,Higher int -- for some reason this is how ID_PARENT named ,[Type] int ) 我需要选择一个子树,其分支仅包含某些[Type]的节点。因为我是SQL和CTE的初学者,所以我首先从下到上查找包含特定类型对象的所有分支: ;WITH c AS ( SELECT ID ,Higher ,[Type] F
DECLARE @TTable TABLE
(
ID int
,Higher int -- for some reason this is how ID_PARENT named
,[Type] int
)
我需要选择一个子树,其分支仅包含某些[Type]的节点。因为我是SQL和CTE的初学者,所以我首先从下到上查找包含特定类型对象的所有分支:
;WITH c
AS
(
SELECT
ID
,Higher
,[Type]
FROM
dbo.EnObj
WHERE Type = 40
UNION ALL
SELECT
t.ID
,t.Higher
,t.Type
FROM
dbo.EnObj T
INNER JOIN c ON t.ID = c.Higher
)
然后将唯一记录选择到表变量中:
INSERT @TTable
SELECT DISTINCT
c.ID
,c.Higher
,c.Type
,c.Name
,c.Voltage
FROM c
然后通过CTE构建一个层次结构,从上到下排序:
;WITH CTE AS (
SELECT
ID
,Higher
,[Type]
,CAST(ID AS VARCHAR(128)) AS Sort
FROM
@TTable
WHERE
Higher IS NULL
UNION ALL
SELECT
N.ID
,N.Higher
,N.[Type]
,CAST(P.Sort + '/' + CAST(N.ID AS VARCHAR) AS VARCHAR(128))
FROM
@TTable N
INNER JOIN CTE AS P ON P.ID = N.Higher
)
SELECT
ID
,Higher
,[Type]
,Sort
FROM CTE
ORDER BY Sort
这是可行的,但我想知道是否有办法优化这个查询,比如使用一个CTE而不是两个,或者在CTE中有一个过滤器
with Hierachy
as
(
select ID, Higher, Type from EnObj
WHERE Type = 40 -- Whatever your search criteria
union all
select EnObj.ID, EnObj.Higher ,EnObj.Type from EnObj
inner join Hierachy
on tblOrgLevel.Higher = Hierachy.ID
)
select * from Hierachy --where ID <> 40
你可以要求我做更多的澄清和修改
您可以要求我做更多的澄清,并做一些修改我认为最后一个查询很好。所有方面都取决于这个人:您想获得特定[Id]下面某个[type]的层次结构吗?或者所有可能的具有某个[type]的树?我需要根元素的整个树(由[Higher]定义为NULL),它只包含以[type]=40的节点结束的分支。我认为最后一个查询非常好。所有方面都可以由这个家伙来完成:您想获得特定[Id]下某个[type]的层次结构吗?或者所有可能具有某个[type]的树?我需要根元素的整个树(由[Higher]定义为NULL),它只包含以[type]=40的节点结束的分支。
WITH DirectReports
AS
(
SELECT parentid, id, Title, 0 AS EmployeeLevel
FROM dbo.tblOrgLevel
WHERE ISNULL(parentid ,0) = 0 and FKAgencyID = 58
UNION ALL
SELECT e.parentid, e.id, e.Title, EmployeeLevel + 1
FROM dbo.tblOrgLevel AS e
INNER JOIN DirectReports AS d
ON e.parentid= d.id
)
SELECT *
FROM DirectReports
ORDER BY parentid;
GO