انجام پردازش در داخل پردازش بازگشتی با استفاده از عبارات جدول مشترک
نمونه داده ها
از جداول با داده ها و جداول سلسله مراتبی زیر با داده های خلاصه شده استفاده کنید:
جدول سلسله مراتب مقدار
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]
;
اما وقتی آن را اجرا می کنم، خطای زیر را دریافت می کنم:
به نظر می رسد نمی توان پردازش مربوط به گروه بندی را در یک عبارت جدول مشترک بازگشتی قرار داد.
جداسازی در پردازش سلسله مراتبی عبارات جدول مشترک (رفتار عادی)
اگرچه در بیان جدول مشترک بازگشتی نمی توان فرایند اگاگرا را توصیف کرد، اما می توان آن را با تعریف بخش پردازش جماعت به عنوان یک عبارت جدول مشترک اجرا کرد.
برای نوشتن چند عبارت جدول مشترک، عبارت های جدول مشترک را با کاما جدا کنید.
-- 共通テーブル式の階層処理内で集計を使用する (正常)
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]
;