Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 сгенерировать несколько последовательностей "От" - "До" в одну  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
SQL 2008

имеется несколько последовательностей чисел от-до
числа только для примера

From  TO
3	 4
7	 9
11	 13
15	 17
............


можно ли одним запросом получить все номера в виде одного списка?
3
4
7
8
9
11
12
13
15
16
17
.........

Спасибо
1 дек 15, 11:46    [18496259]     Ответить | Цитировать Сообщить модератору
 Re: сгенерировать несколько последовательностей "От" - "До" в одну  [new]
Glory
Member

Откуда:
Сообщений: 104760
michael R
можно ли одним запросом получить все номера в виде одного списка?

Можно.
Просто генерируете последовательность всех чисел от 1 до ... и соедияете ее со своей таблицей
1 дек 15, 11:57    [18496368]     Ответить | Цитировать Сообщить модератору
 Re: сгенерировать несколько последовательностей "От" - "До" в одну  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
michael R
можно ли одним запросом получить все номера в виде одного списка?

Можно. И даже не одним способом.
declare @tmp table([from] int,[to] int)
insert into @tmp values (3,4)
insert into @tmp values (7,9)
insert into @tmp values (11,13)
insert into @tmp values (15,17)
;
with tmp ([from],[to]) as (
  select [from],[to]
  from @tmp
  where [from]<=[to]
  union all
  select [from]+1,[to]
  from tmp
  where [from]<[to]
)
select [from] as [no]
from tmp
order by [from]
-- option (maxrecursion 0)

А ещё можно набить табличку чисел на максимальный размер интервала, тогда ещё проще (и быстрее) выйдет.
1 дек 15, 11:59    [18496387]     Ответить | Цитировать Сообщить модератору
 Re: сгенерировать несколько последовательностей "От" - "До" в одну  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
да хорошо
вроде работает
спасиб
1 дек 15, 12:18    [18496566]     Ответить | Цитировать Сообщить модератору
 Re: сгенерировать несколько последовательностей "От" - "До" в одну  [new]
o-o
Guest
есть такая нужная в хозяйстве ф-ция -- GetNums by I.Ben-Gan:
CREATE FUNCTION [dbo].[GetNums](@low AS BIGINT, @high AS BIGINT) RETURNS TABLE
AS
RETURN
  WITH
    L0   AS (SELECT c FROM (SELECT 1 UNION ALL SELECT 1) AS D(c)),
    L1   AS (SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
    L2   AS (SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
    L3   AS (SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
    L4   AS (SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
    L5   AS (SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B),
    Nums AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rownum
             FROM L5)
  SELECT TOP(@high - @low + 1) @low + rownum - 1 AS n
  FROM Nums
  ORDER BY rownum;


вот все решение:
set statistics io, time on
select n
from @t cross apply dbo.GetNums([From], [To]);


на приведенных данных (в последней строке у меня не (15, 17), а (15, 1000000))
declare @t table([From] int, [TO] int);
insert into @t values
(3, 4),
(7, 9),
(11, 13),
(15, 1000000);

set statistics io, time on;

select n
from @t cross apply dbo.GetNums([From], [To]);

with tmp ([from],[to]) as (
  select [from],[to]
  from @t
  where [from]<=[to]
  union all
  select [from]+1,[to]
  from tmp
  where [from]<[to]
)
select [from] as [no]
from tmp
order by [from]
 option (maxrecursion 0)

результат с ф-цией:
(999994 row(s) affected)
Table '#1367E606'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 328 ms, elapsed time = 6729 ms.

и с рекурсией:
(999994 row(s) affected)
Table 'Worktable'. Scan count 2, logical reads 5999959, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#1367E606'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 13073 ms, elapsed time = 20831 ms.
1 дек 15, 12:21    [18496592]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить