सामान्य तालिका व्यंजकों का उपयोग करके पुनरावर्ती प्रसंस्करण के अंदर एकत्रीकरण प्रसंस्करण करना

पेज अद्यतन :
पेज निर्माण की तारीख :

नमूना डेटा

निम्न पदानुक्रमित डेटा और सारांशित डेटा वाली तालिकाओं के साथ तालिकाओं का उपयोग करें:

मात्रा पदानुक्रम तालिका

आईडी (int, PK) नाम (nvarchar(50)) पैसा (bigint) ParentID (int)
1 एक 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]
;

परिणाम

सामान्य तालिका व्यंजकों के पदानुक्रम संसाधन के भीतर एकत्रीकरण (त्रुटि उत्पन्न हुई)

मुझे लगता है कि एक ऐसा मामला है जहां आप सामान्य तालिका अभिव्यक्ति के पदानुक्रमित प्रसंस्करण में एकत्रित मूल्य की गणना करना चाहते हैं। यहां, हम राशि आईडी से जुड़े बिंदुओं की कुल संख्या की गणना करने की कोशिश कर रहे हैं।

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

परिणाम