Это дает правильный ответ, даже если в выбранном диапазоне нет записей. Это также позволяет группировать по полю, чтобы получить набор самых низких значений по группам. Артикул в этом примере относится к порядковым номерам.
SELECT A.myType,
COALESCE (MIN( A.sku) + 1, 1) AS SKU /* 1 is Min Default + 1 */
FROM ( SELECT distinct myType, sku
FROM dbo.myTable AS p1
where p1.sku > 0 /* zero is Min Value */
and p1.sku < 100 /* 100 is Max Value */
union
select distinct myType, 0 as sku /* Guarantee Min Value */
from dbo.myTable as t1
) AS A
LEFT OUTER JOIN
( SELECT distinct myType, sku
FROM dbo.myTable AS p2
where p2.sku > 0 /* zero is Min Value */
and p2.sku < 100 /* 100 is Max Value */
union
select distinct myType, 0 as sku /* Guarantee Min Value */
from dbo.myTable as t2
) AS B
ON A.myType = B.myType AND
A.sku + 1 = B.sku
where (B.sku IS NULL)
GROUP BY A.myType
distinct
на самом деле ускоряет запрос, даже если union
уже делает distinct
. Пока у вас есть индекс для myType и SKU, он должен быть мгновенным.
Очевидно, что вы можете заменить 0 на самые низкие и 100 на самые высокие допустимые значения.