[英]use recursive common table expressions to find consecutive no.s from two tables
我有以下表格:
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.
我使用遞歸cte編寫了一個查詢但是它永遠循環並且在遞歸達到100級后失敗。 我面臨的問題是27場比賽26場比賽,27場比賽27場比賽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
;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
此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'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.