#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