Похоже, что целью запроса OP является создание вспомогательной таблицы (вспомогательной таблицы), которая содержит даты сегодняшнего дня и тринадцать предыдущих месяцев.
Вывод выглядит примерно так (если current_date
возвращает 2020-02-07
):
|Date |
|----------|
|2020-02-07|
|2020-01-07|
|2019-12-07|
|2019-11-07|
|2019-10-07|
|2019-09-07|
|2019-08-07|
|2019-07-07|
|2019-06-07|
|2019-05-07|
|2019-04-07|
|2019-03-07|
|2019-02-07|
|2019-01-07|
Хотя использование UNION ALL
-техники, безусловно, работает, ее трудоемко писать и поддерживать, она действительно работает только для небольшого набора результатов и очень многословна. Хуже - ИМО - он фокусируется на «как» построения набора результатов, а не на «что» и «почему».
К счастью, есть альтернативы этому.
Вариант 1 - GENERATE_SERIES
Используйте функцию GENERATE_SERIES
, которая была доступна в течение многих лет (она даже доступна в HANA 1 SP12):
SELECT
GENERATED_PERIOD_START AS "Date"
FROM
SERIES_GENERATE_DATE ('INTERVAL 1 MONTH' -- step length
, add_months(current_date, -13) -- lower end
, current_date) -- upper END
ORDER BY
"Date" ASC;
Эта опция намного больше кратко, ясно о цели (для генерации ряда дат) и особенностях (длина шага, минимальная и максимальная даты и порядок вывода). Кроме того, это намного быстрее (хорошо, это срабатывает только при создании больших диапазонов).
Вариант 2 - M_TIME_DIMENSION
Использовать саму спецификацию HANA c встроенный календарь aux-table _SYS_REPO.M_TIME_DIMENSION
select
date_sql as "Date"
from
_SYS_BI.M_TIME_DIMENSION td
where
date_sql between add_months (current_date, -13)
and current_date
and day = extract (DAY from current_date)
order by "Date" ASC;
Хотя это менее читабельно, на мой взгляд, оно все же лучше и гибче, чем оригинальный подход.
Также обратите внимание, что для этого необходимо, чтобы таблица была заполнена (через «генерировать данные времени» ) для работы.
Теперь оба эти подхода просто создать наборы результатов, но ОП попросил сохранить их во временных таблицах. Первый очевидный ответ заключается в том, что оба утверждения можно объединить с INSERT
. Однако я бы порекомендовал , а не , сделать это вообще.
При варианте 2) данные уже находятся в таблице. Если запрос для получения диапазона следует повторно использовать в нескольких независимых операторах, то создание представления SQL поможет (и будет правильным решением).
В случае этих независимых операторов в противном случае использовались бы Если временная таблица является частью блока SQLScript, то гораздо лучше выбрать просто присвоить результат запроса переменной таблицы и ссылаться на эту переменную таблицы во всем блоке SQLScript.