Диапазон записей порядкового номера SQL получает оставшийся No

#sql #sql-server

#sql #sql-server

Вопрос:

Основная таблица MSSQL Server 8.0:

 BATCHNo  SEQFrom  SEQTo   
0001    0001    3000  
0001    3000    5000  
0002    0001    0500 
  

Таблица:

 RecordID  BATCHNo  SEQFrom  SEQTo   
1      0001    0001    0100  
2      0001    0102    0202  
3      0001    0210    0222 
  

Я хочу знать недостающие числа (101,203,204,205,206,207,208,209)
Вывод:

 BATCHNo  SEQ   
0001   101
0001   203
0001   204
0001   205
0001   206
0001   207
0001   208
0001   209
  

Комментарии:

1. Пожалуйста, укажите связь между СУБД ввода и вывода и тегами.

2.Правильно ли я понимаю: между SEQTo и следующим SEQFrom — пробел, и вам нужно знать недостающие числа? Было бы неплохо уточнить ваш вопрос. Чтение волшебной стеклянной колбы меня так утомляет… И, пожалуйста, укажите 1) СУБД 2) Версия 3) ожидаемый результат 4) Некоторое объяснение того, чего вы хотите достичь.

3. А также укажите, как вы хотите получить вывод, например, только в виде переменной или строки, или другими способами.

Ответ №1:

Решение в MsSQL 2012 , как показано ниже:

 DECLARE @Tbl TABLE (RecordID INT, BATCHNo VARCHAR(10), SEQFrom VARCHAR(10), SEQTo VARCHAR(10))
INSERT INTO @Tbl        
VALUES
(1,'0001', '0001','0100'),  
(2,'0001', '0102','0202'),  
(3,'0001', '0210','0222') 

;WITH Tally
AS
(
    SELECT 
        ones.n   10 * tens.n   100 * hundreds.n   1000 * thousands.n AS Number,
        T.BATCHNo
    FROM 
        (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) ones(n),
        (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) tens(n),
        (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) hundreds(n),
        (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) thousands(n),
        (SELECT DISTINCT BATCHNo FROM @Tbl) T
    WHERE 
        ones.n   10 * tens.n   100 * hundreds.n   1000 * thousands.n < (SELECT MAX(T.SEQTo * 1) FROM @Tbl T)

), Tmp
AS
(
    SELECT  
        *,
        LEAD(T.SEQFrom) OVER (ORDER BY RecordID) NextSEQ
    FROM @Tbl T

)

SELECT
    A.BATCHNo,
    B.Number AS SEQ
FROM 
    Tmp A INNER JOIN 
    Tally B ON B.Number > A.SEQTo AND B.Number < A.NextSEQ AND A.BATCHNo = B.BATCHNo
  

Результат:

 BATCHNo    SEQ
---------- -----------
0001       101
0001       203
0001       204
0001       205
0001       206
0001       207
0001       208
0001       209