2016-12-02 45 views
-1

我想申请页面或限制CTE的记录,但不是在它的方式,一般建议这样SQL - 寻呼递归CTE而不是在传统的方式

;WITH children AS 
(
    SELECT Item, Parent 
    FROM #TempHeirarchy 
    UNION ALL 
    SELECT e.Item, e.Parent 
    FROM #TempHeirarchy e 
    INNER JOIN children e2 
     ON e.Parent = e2.Item 
) 
select * into #TempFinal 
from (select row_number() over(order by parent asc) as RowNumber, * from children) t 
where t.RowNumber between 1 and 10 

但这种方式是先申请递归到所有记录,然后应用分页,因此即使我仅获取10条记录,也需要很长时间才能完成此操作。

是不是有什么办法,我可以完全停止递归时CTE解析的记录数达到10个记录?

如果这是不可能的,那么有没有任何其他方式在那里我可以生成家长儿童的数据,当它到达页面大小停止?

+1

我没有看到第一个选择的位置或过滤条件。 –

+0

我没有任何条件。如果我在第一个查询本身限制记录,它不会获取实际水平 –

+1

那么如何确定每个组的最顶级父项?根据定义,层次结构有一个起点。 – xQbert

回答

1

生成你自己的递归查询柜台,停止一次算他10

此外,它似乎你已经不局限于你的初始值非常好。你需要从某个地方开始。

;WITH children AS 
(
    SELECT Item, Parent, 0 as cnt 
    FROM #TempHeirarchy 
    WHERE parent is null --? Missing starting value 
    UNION ALL 
    SELECT e.Item, e.Parent, cnt+1 
    FROM #TempHeirarchy e 
    INNER JOIN children e2 
     ON e.Parent = e2.Item 
    WHERE cnt < 10 
) 
select * into #TempFinal 
from children 
+0

不应该从'1'开始或者检查'cnt <10'? –

+0

haha​​ha(ID10T错误) – xQbert

1

是这样的吗?

;WITH children AS 
(
    SELECT Item, Parent, 1 as Level 
    FROM #TempHeirarchy 
    UNION ALL 
    SELECT e.Item, e.Parent, Level+1 as Level 
    FROM #TempHeirarchy e 
    INNER JOIN children e2 
     ON e.Parent = e2.Item 
    WHERE Level <= 10 
) 
+0

这不会限制树的深度吗?我正在谈论记录的数量。 –

+0

然后显示我们的样本数据和预期结果;) –

+0

AFAIK这将限制为10条记录返回;但没有一个谁知道这些将会是什么记录的起点。 – xQbert