Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

पुनरावर्ती CTE समाप्ति जांच को समझना

तिथियों का उपयोग करके यहां एक बेहतर उदाहरण दिया गया है। मान लें कि हम तिथियों की एक तालिका बनाना चाहते हैं। वर्ष 2017 के लिए प्रत्येक माह के लिए 1 पंक्ति। हम एक @startDate . बनाते हैं एंकर और @endDate . के रूप में टर्मिनेटर के रूप में। हमने इन्हें 12 महीनों के लिए अलग रखा है, क्योंकि हम एक साल चाहते हैं। फिर, रिकर्सन DATEADD . के माध्यम से एक महीना जोड़ देगा @startDate . पर कार्य करें टर्मिनेटर WHERE . में मिलने तक खंड। हम जानते हैं कि 12 महीने हिट होने में 11 पुनरावर्तन लगेंगे... यानी, 11 महीने + प्रारंभ तिथि। अगर हम MAXRECURSION . सेट करते हैं 11 से कम के लिए, तो यह विफल हो जाएगा क्योंकि WHERE . को पूरा करने के लिए 11 की आवश्यकता होती है हमारे पुनरावर्ती CTE में खंड , वह टर्मिनेटर है..

declare @startDate datetime = '20170101'
declare @endDate datetime = '20171201'

;WITH Months
as
(
    SELECT @startDate as TheDate       --anchor
    UNION ALL
    SELECT DATEADD(month, 1, TheDate)  --recursive
    FROM Months
    WHERE TheDate < @endDate           --terminator... i.e. continue until this condition is met

)


SELECT * FROM Months OPTION (MAXRECURSION 10) --change this to 11

आपकी क्वेरी के लिए, एक साधारण जुड़ाव पर्याप्त होगा।

select 
  firstName
  ,lastName
  ,orderDate
  ,productID
from
  customers c
inner join
  orders o on o.customerID = c.id

हालांकि, मैं देख रहा हूं कि आप इसे एक अजीब प्रारूप में वापस करने की कोशिश कर रहे हैं, जिसे आप जिस भी रिपोर्टिंग एप्लिकेशन का उपयोग कर रहे हैं उसे संभाला जाना चाहिए। यह आपको बिना रिकर्सन के करीब ले जाएगा।

with cte as(
select 
  firstName
  ,lastName
  ,orderDate
  ,productID
  ,dense_rank() over(order by c.id) as RN
from
  customers c
inner join
  orders o on o.customerID = c.id)


select distinct
  firstName
  ,lastName
  ,null
  ,null
  ,RN
from 
  cte
union all
select
  ''
  ,''
  ,orderDate
  ,productID
  ,RN
from 
  cte
order by RN, firstName desc



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ALTER TABLE कथन FOREIGN KEY बाधा के विपरीत है

  2. वर्तमान उपयोगकर्ता के आधार पर Power BI रिपोर्ट फ़िल्टर करें

  3. SQL सर्वर सर्वर में नियमित अभिव्यक्तियाँ?

  4. एमएस-एक्सेस फ्रंट-एंड एसक्यूएल सर्वर से तारीखों को नहीं पहचानता है

  5. MDF फ़ाइल को SQL सर्वर से कनेक्ट करने के 3 तरीके