Генерация числа между этими полями начала и конца - PullRequest
0 голосов
/ 20 июля 2010

У меня есть 3 столбца (ID, начало и конец) в TSQL.

ID; Start; END
1; 1; 5;
2; 10; 15;

Таким образом, он будет генерировать число вроде:

1, 1
1, 2
1, 3
1, 4
1, 5
2, 10
2, 11
2, 12
2, 13
2, 14
2, 15

Опять же, все, что я могу думать, это курсор, но есть ли лучший способ?

Ответы [ 2 ]

4 голосов
/ 20 июля 2010

как то так (не проверено)

;WITH cNumbers AS
(
   SELECT
       ROW_NUMBER() OVER (ORDER BY c1.object_id) AS ArbitraryNumber
   FROM
       sys.columns c1 CROSS JOIN sys.columns c2
)
SELECT
    M.ID, N.ArbritraryNumber
FROM
    MyTable M
    JOIN
    cNumbers N ON N.ArbitraryNumber BETWEEN M.Start AND M.End

Edit:

Перекрестное соединение дает 298 116 строк в моей базе данных tempdb. И 1,865,956 в пользовательской БД. Если почти 300 тыс. Не достаточно, добавьте еще одно CROSS JOIN.

Это дает мне 162 771 336 в базе данных tempdb и 2 548 895 896 в пользовательской базе данных:

SELECT
    COUNT_BIG(*) --note bigint
FROM
    sys.columns c1 CROSS JOIN sys.columns c2 CROSS JOIN sys.columns c3
2 голосов
/ 20 июля 2010

Подход CTE прост

with tab as(
select 1 as id, 1 as start, 5 as en
union all
select 2, 10, 15),
 cte as(
select id,start,en from tab
union all
select id,start+1 , en from cte where start+1<=en)
select id,start from cte
order by id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...