กําลังดําเนินการประมวลผลการรวมภายในการประมวลผลแบบเรียกใช้ซ้ําโดยใช้นิพจน์ตารางทั่วไป
ข้อมูลตัวอย่าง
ใช้ตารางที่มีข้อมูลลําดับชั้นและตารางต่อไปนี้กับข้อมูลสรุป
ตารางลําดับชั้นยอดเงิน
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]
;
แต่เมื่อฉันเรียกใช้ฉันได้รับข้อผิดพลาดต่อไปนี้:
ดูเหมือนว่าจะไม่สามารถใส่การประมวลผลที่เกี่ยวข้องกับการจัดกลุ่มในนิพจน์ตารางทั่วไปแบบเรียกใช้ซ้ําได้
การรวมในการประมวลผลแบบลําดับชั้นของนิพจน์ตารางทั่วไป (ลักษณะการทํางานปกติ)
แม้ว่าจะไม่สามารถอธิบายกระบวนการรวมในนิพจน์ตารางทั่วไปแบบเรียกใช้ซ้ําได้ แต่ก็สามารถดําเนินการได้โดยการกําหนดส่วนการประมวลผลการรวมเป็นนิพจน์ตารางทั่วไป
เมื่อต้องการเขียนนิพจน์ตารางทั่วไปหลายนิพจน์ ให้แยกนิพจน์ตารางทั่วไปด้วยจุลภาค
-- 共通テーブル式の階層処理内で集計を使用する (正常)
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]
;