7
से लगातार no.s खोजने के लिए

मैं निम्न तालिकाओं है:उपयोग पुनरावर्ती आम तालिका भाव दो तालिकाओं

Actual   Optional 
------   -------- 
4     3 
13    6 
20    7 
26    14 
        19 
        21 
        27 
        28 

क्या मुझे क्या करना है का चयन है:

1) सभी मूल्यों से "वास्तविक" तालिका।

2) "वैकल्पिक" तालिका से चयन मूल्यों अगर वे मूल्यों "वास्तविक" टेबल के साथ एक लगातार श्रृंखला फार्म

की उम्मीद परिणाम है:

Answer 
------ 
4 
13 
20 
26 
3 --because it is consecutive to 4 (i.e 3=4-1) 
14 --14=13+1 
19 --19=20-1 
21 --21=20+1 
27 --27=26+1 
28 --this is the important case.28 is not consecutive to 26 but 27 
    --is consecutive to 26 and 26,27,28 together form a series. 

मैं पुनरावर्ती का उपयोग कर एक प्रश्न लिखा था सीटीई लेकिन यह हमेशा के लिए लूपिंग है और रिकर्सन 100 स्तर तक पहुंचने के बाद विफल रहता है। समस्या मैं का सामना करना पड़ा 26 के साथ 27 मैचों में 27 के साथ 28 मैच और 28.again 27 के साथ 28 से 27 है ... (हमेशा के लिए)

क्वेरी मैं ने लिखा है:

with recurcte as 
     (
     select num as one,num as two from actual 
     union all 
     select opt.num as one,cte.two as two 
     from recurcte cte join optional opt 
     on opt.num+1=cte.one or opt.num-1=cte.one 
     )select * from recurcte 
+2

इस होमवर्क है? सीटीई शर्त क्यों? –

+0

यह होमवर्क नहीं है। यह मेरे पास एक बड़ी समस्या का एक छोटा सा हिस्सा है। मैंने अधिकांश भाग के लिए क्वेरी लिखी है। समस्या को एक ही प्रश्न में लिखा जाना चाहिए। इसलिए यही कारण है कि एक सीटीई नियम – psy

+0

तो आप रिकर्सिव सीटीई के बारे में इस शर्त को हटा सकते हैं? –

उत्तर

6
;WITH Combined 
    AS (SELECT 1 AS Actual, N 
     FROM (VALUES(4), 
         (13), 
         (20), 
         (26)) Actual(N) 
     UNION ALL 
     SELECT 0 AS Actual, N 
     FROM (VALUES(3), 
         (6), 
         (7), 
         (14), 
         (19), 
         (21), 
         (27), 
         (28)) Optional (N)), 
    T1 
    AS (SELECT *, 
       N - DENSE_RANK() OVER (ORDER BY N) AS Grp 
     FROM Combined), 
    T2 
    AS (SELECT *, 
       MAX(Actual) OVER (PARTITION BY Grp) AS HasActual 
     FROM T1) 
SELECT DISTINCT N 
FROM T2 
WHERE HasActual = 1 
+1

पर इंगित करने के लिए धन्यवाद ' टी से पहले अर्धविराम के बिना काम करते हैं;) – sll

+3

@sil जरूरी नहीं है कि अगर आप सभी कथन सही तरीके से समाप्त कर दें (जैसे आपको चाहिए)। इस दो साल पहले ब्लॉग किया गया: http://sqlblog.com/blogs/aaron_bertrand/archive/2009/09/03/ladies-and-gentlemen-start-your-semi-colons.aspx –

+2

और जब तक यह पहला कथन नहीं है बैच। जो दिखाया गया है, यह है। – MatBailie

1

यह CTE आपको वह डेटा देगा जो आप खोज रहे हैं। इसके लिए रिकर्सन अनावश्यक है।

declare @Actual table (i int) 
declare @Optional table (i int) 

insert into @Actual 
    select 4 union select 13 union select 20 union select 26 

insert into @Optional 
    select 3 union select 6 union select 7 union select 14 union select 19 
    union select 21 union select 27 union select 28 

;with rownum as (
    select *, ROW_NUMBER() OVER (ORDER BY i) as 'RN' 
    from (
     select 
      i, 'A' as 'Source' 
     from 
      @Actual 
     union 
     select 
      i, 'O' 
     from 
      @Optional 
    ) a 
) 

select distinct 
    d.i 
from 
    rownum a 
    inner join rownum d 
     on a.i - d.i = a.rn - d.rn 
where 
    a.source = 'A' 
+0

वाह, अच्छी तकनीक! – AakashM

+0

आपको बहुत धन्यवाद :) –

+0

यह ध्यान देने योग्य है कि यदि डुप्लिकेट मान हैं, तो एक तालिका में या उनके संघ – AakashM

संबंधित मुद्दे