Пропавшая серия - PullRequest
       2

Пропавшая серия

0 голосов
/ 07 января 2009

Я создаю хранимую процедуру / функцию в MS SQL, которая должна возвращать отсутствующие серии.

Пример:

таблица "orders" содержит имя поля "ordNo".

ordNo

000001

000003

000005

функции должны возвращать эти значения:

000002

000004

есть идеи?

Большое спасибо.

Ответы [ 3 ]

1 голос
/ 07 января 2009

Как насчет чего-то простого:

SELECT ordNo - 1
FROM Orders o
WHERE NOT EXISTS (
    SELECT *
    FROM Orders n
    WHERE n.ordNo = o.OrdNo - 1        
)
AND ordNo > 1

Редактировать: Ах - это не найдет пропущенных "прогонов" в серии, хотя. Только одиночные пропущенные номера.

Вот версия, которая, я думаю, по крайней мере найдет значения "from" и "to" для "пропущенных" номеров заказов:

SELECT (SELECT MAX(ordNo) + 1 FROM Orders m WHERE m.ordNo < o.OrdNo) fromOrdNo,
    (ordNo - 1) toOrdNo
FROM Orders o
WHERE NOT EXISTS (
    SELECT *
    FROM Orders n
    WHERE n.ordNo = o.OrdNo - 1        
)
AND ordNo > 1
0 голосов
/ 07 января 2009

Возможно, следующий пример поможет.


-- the table that will have rows numbered from 1 to 1000
select top 1000 identity(int,1,1) as id into #X from syscolumns

-- the table with missing values
select top 200 identity(int,1,2) as id into #Y from syscolumns

-- select * from #x
-- select * from #y

select #x.id, #y.id from #x
left outer join #y on #x.id = #y.id
where  #y.id is null

У вас должна быть временная таблица типа #x, в которой будут все значения (включая максимальное значение строки) В приведенном выше примере я предполагаю, что диапазон составляет от 1 до 1000.

0 голосов
/ 07 января 2009

псевдокод для него выглядит так:

1.старт в 00001

2. Увеличьте на 1 и проверьте, существует ли это в таблице (ordNo).

3.Если не существует, верните номер, иначе повторите процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...