Utföra aggregeringsbearbetning i rekursiv bearbetning med vanliga tabelluttryck

Sidan uppdaterad :
Datum för skapande av sida :

Exempel på data

Använd tabeller med följande hierarkiska data och tabeller med sammanfattade data:

Tabell för beloppshierarki

ID (int, PK) Namn (nvarchar(50)) Pengar (bigint) ParentID (int)
1 A 10000 NOLL
2 B 5000 1
3 C 3000 2
11 K 20000 NOLL
12 L 1000 11

Punkttabell

Punkt-ID (int))
, PKBelopps-ID (intPunkt (bigint)
1 1 100
2 1 50
3 2 40
4 3 10
5 3 60
6 3 80
7 11 20
8 12 50
9 12 40

Så här använder du vanliga tabelluttryck

Jag kommer inte att skriva för mycket detaljerat eftersom huvudämnet inte finns här, men för att sammanfatta det enkelt är ett vanligt tabelluttryck som ett valt uttryck som du har definierat i förväg och sedan kan du använda ett valt uttryck som du har definierat utan att skapa flera av samma beskrivning i en senare tabellreferens. Det kan vara en bild nära vyn.

Så här använder du det:

-- 共通テーブル式で事前に select 内容を定義する
with [cte] as
(
  select *
  from [金額階層テーブル]
  where [Money] >= 5000
)
select * from [cte]
union all
select * from [cte]
;

resultat

Representation av hierarkiska data

Jag tror att det förmodligen är detta mönster som gör vanliga tabelluttryck så användbara. Det valda uttrycket för de data som introducerades tidigare kan ersättas med andra saker som vyer och tabellvariabler, så det utnyttjar inte mycket.

Hierarkisk representation kan uppnås genom att anropa vanligare tabelluttryck i vanliga tabelluttryck, som i följande SQL:

Punkter att vara försiktig med när du använder den är "att kombinera det val som är utgångspunkten och det val som förbinder hierarkiska data med union all" och "att förena storleken när du kombinerar strängar".

-- 共通テーブル式で階層データをつなげる
with [cte] as
(
  select
    [ID]
   ,[Name]
   ,[ParentID]
   ,[Money] as [金額合計]
   ,1 as [レベル]
   ,cast([Name] as nvarchar(4000)) as [階層]
  from [金額階層テーブル]
  where [ParentID] is null

  union all

  select
    [子].[ID]
   ,[子].[Name]
   ,[子].[ParentID]
   ,[親].[金額合計] + [子].[Money] as [金額合計]
   ,[親].[レベル] + 1 as [レベル]
   ,[親].[階層] + N'⇒' + [子].[Name] as [階層]
  from [金額階層テーブル] [子]
  inner join [cte] [親]
    on [子].[ParentID] = [親].[ID]
)
select *
from [cte]
order by [ID]
;

resultat

Aggregering inom hierarkibearbetningen av vanliga tabelluttryck (fel inträffade)

Jag tror att det finns ett fall där du vill beräkna det aggregerade värdet i den hierarkiska bearbetningen av det gemensamma tabelluttrycket. Här försöker vi beräkna det totala antalet poäng kopplade till belopps-ID.

-- 共通テーブル式の階層処理内で集計を使用する (エラー)
with [cte] as
(
  select
    [ID]
   ,[Name]
   ,[ParentID]
   ,[Money] as [金額合計]
   ,(
      select sum([ポイント])
      from [ポイントテーブル]
      where [金額ID] = [ID]
    ) as [ポイント合計]
   ,1 as [レベル]
   ,cast([Name] as nvarchar(4000)) as [階層]
  from [金額階層テーブル]
  where [ParentID] is null

  union all

  select
    [子].[ID]
   ,[子].[Name]
   ,[子].[ParentID]
   ,[親].[金額合計] + [子].[Money] as [金額合計]
   ,[親].[ポイント合計] + (
                            select sum([ポイント])
                            from [ポイントテーブル]
                            where [金額ID] = [子].[ID]
                          ) as [ポイント合計]
   ,[親].[レベル] + 1 as [レベル]
   ,[親].[階層] + N'⇒' + [子].[Name] as [階層]
  from [金額階層テーブル] [子]
  inner join [cte] [親]
    on [子].[ParentID] = [親].[ID]
)
select *
from [cte]
order by [ID]
;

Men när jag kör det får jag följande fel:

GROUP BY、HAVING、または集計関数は、再帰共通テーブル式 'cte' の再帰部分では許可されません。

Det verkar som om det inte är möjligt att placera grupperingsrelaterad bearbetning i ett rekursivt gemensamt tabelluttryck.

Aggregering i hierarkisk bearbetning av vanliga tabelluttryck (normalt beteende)

Även om det inte går att beskriva aggregeringsprocessen i det rekursiva gemensamma tabelluttrycket kan den köras genom att definiera aggregeringsbearbetningsdelen som ett gemensamt tabelluttryck.

Om du vill skriva flera vanliga tabelluttryck avgränsar du de vanliga tabelluttrycken med kommatecken.

-- 共通テーブル式の階層処理内で集計を使用する (正常)
with [ポイント合計CTE] as
(
  select
    [金額ID]
   ,sum([ポイント]) as [ポイント合計]
  from [ポイントテーブル]
  group by [金額ID]
)
,[cte] as
(
  select
    [ID]
   ,[Name]
   ,[ParentID]
   ,[Money] as [金額合計]
   ,(
      select [ポイント合計]
      from [ポイント合計CTE]
      where [金額ID] = [ID]
    ) as [ポイント合計]
   ,1 as [レベル]
   ,cast([Name] as nvarchar(4000)) as [階層]
  from [金額階層テーブル]
  where [ParentID] is null

  union all

  select
    [子].[ID]
   ,[子].[Name]
   ,[子].[ParentID]
   ,[親].[金額合計] + [子].[Money] as [金額合計]
   ,[親].[ポイント合計] + (
                            select [ポイント合計]
                            from [ポイント合計CTE]
                            where [金額ID] = [子].[ID]
                          ) as [ポイント合計]
   ,[親].[レベル] + 1 as [レベル]
   ,[親].[階層] + N'⇒' + [子].[Name] as [階層]
  from [金額階層テーブル] [子]
  inner join [cte] [親]
    on [子].[ParentID] = [親].[ID]
)
select *
from [cte]
order by [ID]
;

resultat