2015-01-29 3 views
0

Две таблицы члена, который состоит из VoucherCode (обнуляемым Int) и схема (BigInt) схемное состоит из schemeId (BigInt), mincode (INT), maxcode (интермедиат)Найти промежутки между в мин и макс

Мне нужно найти пробелы в ваучерокодах членов, внутри минимальных и максимальных кодов. Если mincode равен 1, а maxcode - 10, а существующие коды ваучеров - 2, 3 и 4, то он должен вернуть 1. Если существуют коды 1, 2 и 4, тогда он должен вернуть 3. Если 1, 2 и 3 существуют, должен вернуть 4.

Это то, что я до сих пор:

SELECT MIN(ID + 1) FROM (
    SELECT mincode AS ID from Scheme as s UNION ALL 
    SELECT 
     MIN(vouchercode + 1) 
    FROM  
     member mmm where mmm.voucherCode is not null 
     ) AS T1 
WHERE 
    ID+1 NOT IN (SELECT vouchercode as ID FROM member m where voucherCode is not null) 

Это работает, но не для всех 3 сценариев. Если существуют 2, 3 и 4, тогда он возвращает нуль вместо 1. 1, 3 и 4, тогда он возвращает 2, правильно! 1, 2 и 3, и он возвращает нуль, а не 4.

+0

Это было бы довольно просто с таблицей таблиц. –

ответ

0

Вот один из способов сделать это, используя таблицу подсчета. У меня есть вид в моей системе с ctes, но я их извлек. При необходимости вы можете увеличить таблицу таблиц до большего количества строк.

WITH 
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)), 
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows 
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max 
    cteTally(N) AS 
    (
     SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4 
    ) 

select MIN(t.N) 
from cteTally t 
left join Scheme s on s.ID = t.N 
where s.ID is null 
Смежные вопросы