在SQL中使用输出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) 如何组合如上所示的结果集?仍然不

我试图使用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) 如何组合如上所示的结果集?

仍然不能完全确定您在这里想要什么,但我认为您已经有了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