7
找到連續編號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 28.again 28 27 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

這是功課?爲什麼CTE規定? –

+0

這不是家庭作業。這是我有一個大問題的一小部分。我寫了大部分的查詢。這個問題必須寫在一個單一的查詢。所以這就是爲什麼cte規定 – psy

+0

那麼你可以刪除這個關於遞歸CTEs的規定呢? –

回答

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

Won'在WITH之前沒有分號就可以工作;) – 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