#sql #teradata
Вопрос:
У меня есть таблица, как показано ниже
EMP_NUM | START_RNG | КОНЕЦ |
---|---|---|
123 | H1 | H3 |
456 | H4 | H6 |
и мне нужно, чтобы он выглядел так, как показано ниже.
EMP_NUM | ID |
---|---|
123 | H1 |
123 | H2 |
123 | H3 |
456 | H4 |
456 | H5 |
456 | H6 |
Я задавал аналогичный вопрос в отношении дат в своем предыдущем посте, однако я не думаю EXPAND ON
, что это сработает, так как он работает в определенные периоды времени. Есть ли способ решить эту проблему в Teradata. Я тоже новичок в рекурсии. Попробовал нижеприведенную логику, но получил ошибку в Teradata. Не уверен, что существует альтернативный синтаксис.
WITH temp AS
(
SELECT 1 AS ID
UNION ALL
SELECT t.ID 1 FROM temp t
WHERE t.ID < 100000
) -- return table with id from 1 to 100000
SELECT t.ID, y.EMP_NUM
FROM Table1 y
INNER JOIN temp t ON t.ID BETWEEN y.START_RNG AND y.END_RNG
OPTION (MAXRECURSION 0);
Ответ №1:
Не уверен, что это лучший ответ, но, по крайней мере, он был бы синтаксически правильным.
WITH RECURSIVE temp AS
(
SELECT * from (SELECT 1 AS ID) z
UNION ALL
SELECT t.ID 1 FROM temp t
WHERE t.ID < 100
) -- return table with id from 1 to 100000
SELECT t.ID, y.EMP_NUM
FROM Table1 y
INNER JOIN temp t ON t.ID BETWEEN y.START_RNG AND y.END_RNG
;
Возможно, можно использовать РАСШИРЕНИЕ путем искусственного преобразования в диапазон дат/времени и обратно, например
SELECT begin(PD)-date'1900-01-01' as ID, EMP_NUM
FROM Table1
EXPAND ON PERIOD(date'1900-01-01' START_RNG,date'1900-01-01' END_RNG 1) as PD;