Udførelse af aggregeringsbehandling i rekursiv behandling ved hjælp af almindelige tabeludtryk

Side opdateret :
Dato for oprettelse af side :

Eksempel på data

Brug tabeller med følgende hierarkiske data og tabeller med opsummerede data:

Tabel over beløbshierarki

ID (int, PK)Navn (nvarchar(50)Penge (bigint)ParentID (int)
1 En 10000 NUL
2 B 5000 1
3 C 3000 2
11 K 20000 NUL
12 L 1000 11

Punkttabel

Punkt-ID (int))
, PKBeløbs-ID (intPoint (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ådan bruger du almindelige tabeludtryk

Jeg vil ikke skrive for meget detaljeret, fordi hovedemnet ikke er her, men for at opsummere det simpelthen er et fælles tabeludtryk som et udvalgt udtryk, som du har defineret på forhånd, og så kan du bruge et valgt udtryk, som du har defineret uden at oprette flere af den samme beskrivelse i en senere tabelreference. Det kan være et billede tæt på udsigten.

Sådan bruges det:

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

resultat

Repræsentation af hierarkiske data

Jeg tror, det sandsynligvis er dette mønster, der gør almindelige tabeludtryk så nyttige. Det valgte udtryk for de data, der blev introduceret tidligere, kan erstattes af andre ting såsom visninger og tabelvariabler, så det ikke udnytter meget.

Hierarkisk repræsentation kan opnås ved at kalde mere almindelige tabeludtryk i almindelige tabeludtryk som i følgende SQL:

Punkter, der skal være forsigtige med, når du bruger det, er "at kombinere det valg, der er udgangspunktet, og det valg, der forbinder de hierarkiske data med union all" og "at forene størrelsen, når du kombinerer strenge".

-- 共通テーブル式で階層データをつなげる
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 i hierarkiet behandling af almindelige tabeludtryk (der opstod fejl)

Jeg tror, at der er et tilfælde, hvor du vil beregne den aggregerede værdi i den hierarkiske behandling af det fælles tabeludtryk. Her forsøger vi at beregne det samlede antal point, der er knyttet til beløbs-id'et.

-- 共通テーブル式の階層処理内で集計を使用する (エラー)
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 jeg kører det, får jeg følgende fejl:

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

Det ser ud til, at det ikke er muligt at placere grupperingsrelateret behandling i et rekursivt fælles tabeludtryk.

Aggregering i den hierarkiske behandling af almindelige tabeludtryk (normal funktionsmåde)

Selvom det ikke er muligt at beskrive sammenlægningsprocessen i det rekursive fælles tabeludtryk, kan den udføres ved at definere sammenlægningsbehandlingsdelen som et fælles tabeludtryk.

Hvis du vil skrive flere almindelige tabeludtryk, skal du adskille de almindelige tabeludtryk med kommaer.

-- 共通テーブル式の階層処理内で集計を使用する (正常)
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