Provádění zpracování agregace v rámci rekurzivního zpracování pomocí běžných výrazů tabulky

Stránky aktualizovány :
Datum vytvoření stránky :

Ukázková data

Použijte tabulky s následujícími hierarchickými daty a tabulky se souhrnnými daty:

Tabulka hierarchie částek

ID (int, PK) Jméno (nvarchar(50)) Peníze (bigint) ParentID (int)
1 A 10000 NULA
2 B 5000 1
3 C 3000 2
11 K 20000 NULA
12 L 1000 11

Bodová tabulka

ID bodu (int))
, PKID částky (intBod (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

Jak používat běžné výrazy tabulky

Nebudu psát příliš podrobně, protože hlavní téma zde není, ale abych to shrnul jednoduše, běžný výraz tabulky je jako výraz select, který jste předem definovali, a pak můžete použít výraz select, který jste definovali, aniž byste vytvořili více stejného popisu v pozdějším odkazu na tabulku. Může to být obrázek blízký pohledu.

Zde je návod, jak ji používat:

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

výsledek

Reprezentace hierarchických dat

Myslím, že je to pravděpodobně tento vzorec, který dělá běžné výrazy tabulky tak užitečné. Výběrový výraz dříve zavedených dat může být nahrazen jinými věcmi, jako jsou zobrazení a proměnné tabulky, takže toho moc nevyužívá.

Hierarchické reprezentace lze dosáhnout voláním běžnějších výrazů tabulky v běžných výrazech tabulky, jako v následujícím SQL:

Body, na které je třeba dávat pozor při jeho použití, jsou "kombinovat výběr, který je výchozím bodem, a výběr, který spojuje hierarchická data se sjednocením všech" a "sjednotit velikost při kombinování řetězců".

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

výsledek

Agregace v hierarchickém zpracování běžných tabulkových výrazů (došlo k chybě)

Myslím, že existuje případ, kdy chcete vypočítat agregovanou hodnotu v hierarchickém zpracování společného výrazu tabulky. Zde se pokoušíme vypočítat celkový počet bodů spojených s ID částky.

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

Ale když ji spustím, dostanu následující chybu:

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

Zdá se, že není možné umístit zpracování související se seskupením do rekurzivního společného výrazu tabulky.

Agregace v hierarchickém zpracování běžných výrazů tabulky (normální chování)

Ačkoli není možné popsat proces agregace v rekurzivním společném výrazu tabulky, lze jej provést definováním části zpracování agregace jako společného výrazu tabulky.

Chcete-li napsat více běžných výrazů tabulky, oddělte běžné výrazy tabulky čárkami.

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

výsledek