2016-12-02 6 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

関連する問題