انجام پردازش در داخل پردازش بازگشتی با استفاده از عبارات جدول مشترک

صفحه به روز شده :
تاریخ ایجاد صفحه :

نمونه داده ها

از جداول با داده ها و جداول سلسله مراتبی زیر با داده های خلاصه شده استفاده کنید:

جدول سلسله مراتب مقدار

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

جدول نقطه ای

نقطه ID (int))
, PKمقدار ID (intنقطه (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

نحوه استفاده از عبارات جدول مشترک

من در جزئیات بیش از حد نمی نویسم چون موضوع اصلی در اینجا نیست، بلکه برای خلاصه کردن آن به سادگی، یک بیان جدول مشترک مانند یک عبارت انتخابی است که شما از قبل تعریف کرده باشید و سپس می توانید از یک عبارت انتخابی استفاده کنید که بدون ایجاد چند توصیف مشابه در یک مرجع جدول بعدی تعریف کرده باشید. ممکن است تصویری نزدیک به منظره باشد.

در اینجا نحوه استفاده از آن:

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

نتیجه

بازنمایی داده های سلسله مراتبی

من فکر می کنم احتمالا این الگو است که باعث می شود عبارات جدول مشترک بسیار مفید است. عبارت انتخابی داده های معرفی شده زودتر را می توان جایگزین چیزهای دیگری مانند نماها و متغیرهای جدول کرد، بنابراین از آن بهره چندانی نمی برد.

بازنمایی سلسله مراتبی را می توان با فراخوانی عبارات جدول رایج تر در عبارات جدول مشترک، مانند SQL زیر به دست آورد:

امتیاز به دقت در هنگام استفاده از آن هستند "به ترکیب انتخاب است که نقطه شروع و انتخاب است که اتصال داده های سلسله مراتبی با اتحاد همه" و "برای متحد کردن اندازه در هنگام ترکیب رشته ها".

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

نتیجه

Aggregation within the hierarchy processing of common table expressions (error occurred)

من فکر می کنم که یک مورد وجود دارد که در آن شما می خواهید برای محاسبه مقدار تجمیع شده در پردازش سلسله مراتبی از بیان جدول مشترک است. در اینجا سعی می کنیم تعداد کل نقاط مرتبط با شناسه مقدار را محاسبه کنیم.

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

اما وقتی آن را اجرا می کنم، خطای زیر را دریافت می کنم:

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

به نظر می رسد نمی توان پردازش مربوط به گروه بندی را در یک عبارت جدول مشترک بازگشتی قرار داد.

جداسازی در پردازش سلسله مراتبی عبارات جدول مشترک (رفتار عادی)

اگرچه در بیان جدول مشترک بازگشتی نمی توان فرایند اگاگرا را توصیف کرد، اما می توان آن را با تعریف بخش پردازش جماعت به عنوان یک عبارت جدول مشترک اجرا کرد.

برای نوشتن چند عبارت جدول مشترک، عبارت های جدول مشترک را با کاما جدا کنید.

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

نتیجه