إجراء معالجة التجميع داخل المعالجة التكرارية باستخدام تعبيرات الجدول الشائعة

تحديث الصفحة :
تاريخ إنشاء الصفحة :

عينة من البيانات

استخدم الجداول التي تحتوي على البيانات الهرمية التالية والجداول ذات البيانات الملخصة:

جدول التدرج الهرمي للمبلغ

ID (int, PK))))
Name (nvarchar(50Money (bigintParentID (int)
1 A 10000 صِفْر
2 B 5000 1
3 C 3000 2
11 K 20000 صِفْر
12 L 1000 11

جدول النقاط

معرف النقطة (int))
, PKمعرف المبلغ (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]
;

نتيجة

التجميع ضمن معالجة التدرج الهرمي لتعبيرات الجداول الشائعة (حدث خطأ)

أعتقد أن هناك حالة تريد فيها حساب القيمة المجمعة في المعالجة الهرمية لتعبير الجدول المشترك. هنا ، نحاول حساب إجمالي عدد النقاط المرتبطة بمعرف المبلغ.

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

نتيجة