Esecuzione dell'elaborazione di aggregazione all'interno dell'elaborazione ricorsiva mediante espressioni di tabella comuni

Pagina aggiornata :
Data di creazione della pagina :

Dati di esempio

Utilizzare tabelle con i dati gerarchici seguenti e tabelle con dati riepilogativi:

Tabella della gerarchia degli importi

ID (int, PK) Nome (nvarchar(50)) Denaro (bigint) ParentID (int)
1 Un 10000 NULLO
2 B 5000 1
3 C 3000 2
11 Okay 20000 NULLO
12 L 1000 11

Tabella dei punti

ID punto (int))
, PKID importo (intPunto (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

Come utilizzare espressioni di tabella comuni

Non scriverò troppo in dettaglio perché l'argomento principale non è qui, ma per riassumerlo semplicemente, un'espressione di tabella comune è come un'espressione di selezione che hai definito in anticipo e quindi puoi usare un'espressione di selezione che hai definito senza creare più della stessa descrizione in un riferimento di tabella successivo. Potrebbe trattarsi di un'immagine vicina alla vista.

Ecco come usarlo:

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

risultato

Rappresentazione di dati gerarchici

Penso che sia probabilmente questo modello che rende le espressioni di tabella comuni così utili. L'espressione select dei dati introdotti in precedenza può essere sostituita da altre cose come viste e variabili di tabella, quindi non sfrutta molto.

La rappresentazione gerarchica può essere ottenuta chiamando espressioni di tabella più comuni in espressioni di tabella comuni, come nel seguente SQL:

I punti a cui prestare attenzione quando lo si utilizza sono "combinare la selezione che è il punto di partenza e la selezione che collega i dati gerarchici con l'unione di tutti" e "unificare la dimensione quando si combinano le stringhe".

-- 共通テーブル式で階層データをつなげる
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]
;

risultato

Aggregazione all'interno della gerarchia elaborazione di espressioni di tabella comuni (errore verificatosi)

Penso che ci sia un caso in cui si desidera calcolare il valore aggregato nell'elaborazione gerarchica dell'espressione di tabella comune. Qui, stiamo cercando di calcolare il numero totale di punti collegati all'ID dell'importo.

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

Ma quando lo eseguo, ottengo il seguente errore:

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

Sembra che non sia possibile inserire l'elaborazione correlata al raggruppamento in un'espressione di tabella comune ricorsiva.

Aggregazione nell'elaborazione gerarchica di espressioni di tabella comuni (comportamento normale)

Sebbene non sia possibile descrivere il processo di aggregazione nell'espressione di tabella comune ricorsiva, è possibile eseguirlo definendo la parte di elaborazione dell'aggregazione come espressione di tabella comune.

Per scrivere più espressioni di tabella comuni, separare le espressioni di tabella comuni con virgole.

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

risultato