在SQL中使用输出CTE内联?
我试图使用CTE内联,就像一个函数,但我无法创建一个函数,因为我只有对数据库的只读访问权限。还有其他简单的方法吗 查询:在SQL中使用输出CTE内联?,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我试图使用CTE内联,就像一个函数,但我无法创建一个函数,因为我只有对数据库的只读访问权限。还有其他简单的方法吗 查询: SELECT SuiteID,ParentSuiteID FROM tbl_Suite; 结果集如下所示: SuiteID ParentSuiteID 1 0 4 1 5 4 6 4 7 4 8 4 9 4 10 4 11 4 我的问题是: A) 如何将SuiteID作为内联子查询传递给递归CTE查询? B) 如何组合如上所示的结果集?仍然不
SELECT SuiteID,ParentSuiteID FROM tbl_Suite;
结果集如下所示:
SuiteID ParentSuiteID
1 0
4 1
5 4
6 4
7 4
8 4
9 4
10 4
11 4
我的问题是:
A) 如何将SuiteID作为内联子查询传递给递归CTE查询?
B) 如何组合如上所示的结果集?仍然不能完全确定您在这里想要什么,但我认为您已经有了99.99999%的代码。理想情况下,您可以发布一些可消费的数据。沿着这些路线
create table #tbl_suite
(
SuiteID int
, ParentSuiteID int
)
insert #tbl_suite
select 1, 0 union all
select 4, 1 union all
select 5, 4 union all
select 6, 4 union all
select 7, 4 union all
select 8, 4 union all
select 9, 4 union all
select 10, 4 union all
select 11, 4
然后,所有人所要做的就是处理查询,而不是设置和查询。用你的cte,这差不多完成了。我不得不删除Title和PlanID,因为它们不在您的新样本数据中
WITH HIERARCHY AS
(
select T1.SuiteID
--, T1.Title
, T1.ParentSuiteID
, 0 Level
FROM #tbl_Suite(nolock) T1
Where T1.ParentSuiteID = 0
--AND T1.PlanID = '404'
UNION ALL
select T2.SuiteID
--, T2.Title
, T2.ParentSuiteID
, Level + 1
from #tbl_Suite(nolock) AS T2
INNER JOIN HIERARCHY AS H ON T2.ParentSuiteID = H.SuiteID
)
select SuiteID
, ParentSuiteID
, case when Level = 0 then Level else Level -1 end as Level
from HIERARCHY
我不确定我是否理解您的数据。SuiteId=1在级别0还是级别1上 在您的结果集中
SuiteID ParentSuiteID Level1ParentID
1 0 0
4 1 0
5 4 1
6 4 1
7 4 1
8 4 1
9 4 1
10 4 1
11 4 1
对于(5,…,11)中的成员SuiteID,您将SuiteID=1作为Level1ParentID返回,但是SuiteID=1不是SuiteID=4的Level1ParentID吗
如果SuiteID=4为1级,则Resultl应为:
SuiteID ParentSuiteID Level1ParentID
1 0 0
4 1 0
5 4 4
6 4 4
7 4 4
8 4 4
9 4 4
10 4 4
11 4 4
这段代码给出了所需的结果。我将原始CTE用于层次结构,并在层次结构中记录Level1ParentId
如果我们以suiteid=1作为级别1开始,则会得到以下结果:
SuiteID ParentSuiteID Level1ParentId
1 0 0
4 1 1
5 4 1
6 4 1
7 4 1
8 4 1
9 4 1
10 4 1
11 4 1
如果我们从0级开始,那么我们得到:
SuiteID ParentSuiteID Level1ParentId
1 0 0
4 1 0
5 4 4
6 4 4
7 4 4
8 4 4
9 4 4
10 4 4
11 4 4
代码如下:
;with tbl_Suite as
(
select * from (values
(1 , 0 ,'title 1' ,'404')
,(4 , 1,'title 4' ,'404')
,(5 , 4,'title 5' ,'404')
,(6 , 4,'title 6' ,'404')
,(7 , 4,'title 7' ,'404')
,(8 , 4,'title 8' ,'404')
,(9 , 4,'title 9' ,'404')
,(10, 4,'title 10','404')
,(11, 4,'title 11','404')
) s(SuiteID,ParentSuiteID,Title,PlanId))
,HIERARCHY AS
( select T1.SuiteID,T1.Title,T1.ParentSuiteID, 0 Level,0 Level1ParentId FROM tbl_Suite T1
Where T1.ParentSuiteID = 0 AND T1.PlanID = '404'
UNION ALL
select T2.SuiteID,T2.Title,T2.ParentSuiteID,Level+1
,case when Level=1 then t2.ParentSuiteID else Level1ParentId end
from tbl_Suite AS T2
INNER JOIN HIERARCHY AS H
ON T2.ParentSuiteID = H.SuiteID
)
select a.SuiteID,a.ParentSuiteID,b.Level1ParentId from tbl_Suite a
inner join HIERARCHY b
on a.SuiteID=b.SuiteID
在继续使用NOLOCK乱丢查询之前,您可以先看看本文。真正有帮助的是,如果您可以为表和样本数据以及所需的输出提供ddl。因为现在第一个查询太长,太混乱,无法解释,所以我根本不清楚你们想做什么。这将是一个很好的起点。嗨,Sean,在第一个查询中,我试图获取我打算应用聚合的结果集。对于这个查询,只有列SuiteID是重要的,因为它具有父子关系,所以我需要为每个SuiteID找到第二级父项,这就是下面的CTE所做的。我无法将这两个代码合并为一个结果集。如果您真的需要帮助,请参阅我的最后一条评论。@SeanLange谢谢您的反馈。我已经重新表述了我的问题。嗨,肖恩,我想我正在尝试将结果集作为上一个查询中的一个新列,因为我必须确定每个suiteid的第一个父项。我不确定我解释的是否正确。你看,一个suiteid可以上卷到一个父级,这个父级又会有一个父级,这个父级又会上卷到根级。必须为所有记录调用CTE,以确定父记录。我明白,这肯定很让人困惑。不如发布一些代表问题的示例数据、期望的输出和解释。
SuiteID ParentSuiteID Level1ParentId
1 0 0
4 1 0
5 4 4
6 4 4
7 4 4
8 4 4
9 4 4
10 4 4
11 4 4
;with tbl_Suite as
(
select * from (values
(1 , 0 ,'title 1' ,'404')
,(4 , 1,'title 4' ,'404')
,(5 , 4,'title 5' ,'404')
,(6 , 4,'title 6' ,'404')
,(7 , 4,'title 7' ,'404')
,(8 , 4,'title 8' ,'404')
,(9 , 4,'title 9' ,'404')
,(10, 4,'title 10','404')
,(11, 4,'title 11','404')
) s(SuiteID,ParentSuiteID,Title,PlanId))
,HIERARCHY AS
( select T1.SuiteID,T1.Title,T1.ParentSuiteID, 0 Level,0 Level1ParentId FROM tbl_Suite T1
Where T1.ParentSuiteID = 0 AND T1.PlanID = '404'
UNION ALL
select T2.SuiteID,T2.Title,T2.ParentSuiteID,Level+1
,case when Level=1 then t2.ParentSuiteID else Level1ParentId end
from tbl_Suite AS T2
INNER JOIN HIERARCHY AS H
ON T2.ParentSuiteID = H.SuiteID
)
select a.SuiteID,a.ParentSuiteID,b.Level1ParentId from tbl_Suite a
inner join HIERARCHY b
on a.SuiteID=b.SuiteID