กําลังดําเนินการประมวลผลการรวมภายในการประมวลผลแบบเรียกใช้ซ้ําโดยใช้นิพจน์ตารางทั่วไป

ปรับปรุงหน้า :
วันที่สร้างเพจ :

ข้อมูลตัวอย่าง

ใช้ตารางที่มีข้อมูลลําดับชั้นและตารางต่อไปนี้กับข้อมูลสรุป

ตารางลําดับชั้นยอดเงิน

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

ตารางคะแนน

รหัสจุด (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]
;

ผล