Koostekäsittely rekursiivisen käsittelyn sisällä yleisten taulukkolausekkeiden avulla

Sivu päivitetty :
Sivun luontipäivämäärä :

Esimerkkitiedot

Käytä taulukoita, joissa on seuraavat hierarkkiset tiedot, ja taulukoita, joissa on yhteenvetotietoja:

Summahierarkian taulu

TUNNUS (int, PK) Nimi (nvarchar(50)) Raha (bigint) ParentID (int)
1 A 10000 NOLLA
2 B 5000 1
3 C 3000 2
11 K 20000 NOLLA
12 L 1000 11

Pistetaulukko

Pistetunnus (int))
, PKSumman tunnus (intPiste (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

Yleisten taulukkolausekkeiden käyttäminen

En kirjoita liian yksityiskohtaisesti, koska pääaihe ei ole täällä, mutta yhteenvetona siitä yksinkertaisesti, yhteinen taulukkolauseke on kuin etukäteen määrittämäsi valintalauseke, ja sitten voit käyttää määrittämääsi valintalauseketta luomatta useita saman kuvauksen kuvauksia myöhemmässä taulukkoviittauksessa. Se voi olla kuva lähellä näkymää.

Voit käyttää sitä seuraavasti:

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

tulos

Hierarkkisten tietojen esittäminen

Luulen, että juuri tämä kuvio tekee tavallisista taulukkolausekkeista niin hyödyllisiä. Aiemmin käyttöön otettujen tietojen valittu lauseke voidaan korvata muilla asioilla, kuten näkymillä ja taulukkomuuttujilla, joten se ei hyödynnä paljon.

Hierarkkinen esitystapa voidaan saavuttaa kutsumalla yleisempiä taulukkolausekkeita yleisissä taulukkolausekkeissa, kuten seuraavassa SQL:ssä:

Jos haluat olla varovainen, kun käytät sitä, on "yhdistää valinta, joka on lähtökohta ja valinta, joka yhdistää hierarkkiset tiedot liitos kaikkiin" ja "koon yhdistäminen merkkijonoja yhdistettäessä".

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

tulos

Kooste yleisten taulukkolausekkeiden hierarkiakäsittelyssä (tapahtui virhe)

Mielestäni on olemassa tapaus, jossa haluat laskea aggregoidun arvon yhteisen taulukkolausekkeen hierarkkisessa käsittelyssä. Tässä yritämme laskea summatunnukseen linkitettyjen pisteiden kokonaismäärän.

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

Mutta kun suoritan sen, saan seuraavan virheen:

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

Näyttää siltä, että ryhmittelyyn liittyvää käsittelyä ei ole mahdollista sisällyttää rekursiiviseen yhteiseen taulukkolausekkeeseen.

Koosteet yleisten taulukkolausekkeiden hierarkkisessa käsittelyssä (normaali toiminta)

Vaikka koosteprosessia ei ole mahdollista kuvata rekursiivisessa yhteisessä taulukkolausekkeessa, se voidaan suorittaa määrittämällä koosteen käsittelyosa yleiseksi taulukkolausekkeeksi.

Jos haluat kirjoittaa useita yleisiä taulukkolausekkeita, erota yleiset taulukkolausekkeet pilkuilla.

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

tulos