2013-12-06 2 views
0

Учитывая, что следующие общие табличные выражения генерируют все целые числа между двумя числами (1 и 9 в данном случае):Слишком сложно использовать общее табличное выражение для этого?

WITH numbers(n) AS 
(
    SELECT 1 as n 
    UNION ALL 
    SELECT n+1 as n FROM numbers WHERE n < 9 
) 
select * from numbers 

У меня есть таблица под названием Уровней:

SELECT * from Levels 

Player StartingLevel EndingLevel 
john  2    4 
Ed  7    8 

хочет КТР в вернуть один ряд для каждого уровня сложности в пределах диапазона для каждого игрока, например:

PLAYER CurrentLevel 
John 2 
John 3 
John 4 
Ed  7 
Ed  8 

можно ли это сделать с помощью CTE? или мне просто нужно написать хранимую процедуру, чтобы сделать это?

ответ

2

попробовать это:

WITH playerlevels(player, level) AS 
(
    SELECT player, startingLevel 
    From Levels 
    Union all 
    SELECT player, cast(p.level+1 as integer) 
    from playerlevels p 
    join Levels l 
     On p.player = l.player 
    where p.level+1 <= l.EndingLevel 
) 
select * from playerlevels 
0

Вы могли бы просто присоединиться к КТР таблицу уровней с помощью BETWEEN:

WITH numbers(n) AS 
(
    SELECT 1 as n 
    UNION ALL 
    SELECT n+1 as n 
    FROM numbers 
    WHERE n < 9 
) 
SELECT l.Player, n.n AS CurrentLevel 
FROM numbers n 
JOIN Levels l 
    ON n.n BETWEEN l.StartingLevel AND l.EndingLevel 

Демо: SQL Fiddle

Смежные вопросы