Apkopojuma apstrādes veikšana rekursīvajā apstrādē, izmantojot parastās tabulas izteiksmes

Lapa atjaunota :
Lapas izveides datums :

Datu paraugs

Izmantojiet tabulas ar šādiem hierarhiskiem datiem un tabulas ar apkopotiem datiem:

Summu hierarhijas tabula

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

Punktu tabula

Punkta ID (int))
, PKSummas ID (intPunkts (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

Kā izmantot parastās tabulas izteiksmes

Es nerakstīšu pārāk daudz detaļu, jo galvenā tēma nav šeit, bet, lai to vienkārši apkopotu, kopēja tabulas izteiksme ir kā iepriekš definēta atlases izteiksme, un tad jūs varat izmantot atlasīto izteiksmi, kuru esat definējis, neveidojot viena un tā paša apraksta vairākas reizes vēlākā tabulas atsaucē. Tas var būt attēls tuvu skatam.

Lai to izmantotu, rīkojieties šādi:

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

rezultāts

Hierarhisko datu attēlojums

Es domāju, ka tas, iespējams, ir šis modelis, kas padara kopīgas galda izteiksmes tik noderīgas. Agrāk ieviesto datu atlases izteiksmi var aizstāt ar citām lietām, piemēram, skatiem un tabulas mainīgajiem, tāpēc tā daudz neizmanto.

Hierarhisku attēlojumu var panākt, izsaucot biežāk sastopamas tabulas izteiksmes kopējās tabulas izteiksmēs, piemēram, šādā SQL:

Punkti, no kuriem jāuzmanās, lietojot to, ir "apvienot atlasi, kas ir sākumpunkts, un atlasi, kas savieno hierarhiskos datus ar visu savienošanu" un "lai apvienotu lielumu, apvienojot virknes".

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

rezultāts

Apkopojums kopējo tabulu izteiksmju hierarhijas apstrādē (radās kļūda)

Es domāju, ka ir gadījums, kad vēlaties aprēķināt apkopoto vērtību kopējās tabulas izteiksmes hierarhiskajā apstrādē. Šeit mēs cenšamies aprēķināt kopējo punktu skaitu, kas saistīts ar summas 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]
;

Bet, palaižot to, es saņemu šādu kļūdu:

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

Šķiet, ka ar grupēšanu saistīto apstrādi nav iespējams ievietot rekursīvā kopējā tabulas izteiksmē.

Apkopojums bieži lietoto tabulu izteiksmju hierarhiskajā apstrādē (parastā uzvedība)

Lai gan rekursīvajā kopējās tabulas izteiksmē nav iespējams aprakstīt apkopošanas procesu, to var izpildīt, definējot apkopošanas apstrādes daļu kā kopīgu tabulas izteiksmi.

Lai rakstītu vairākas kopīgas tabulas izteiksmes, atdaliet kopējās tabulas izteiksmes ar komatiem.

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

rezultāts