在 HANA 中创建临时 table 并使用 WITH 子句放置数据
Create temp table in HANA and put data using WITH clause
如何将此结果放入 HANA 中的临时 table?我是 HANA 的新手。现在它 return 正确的数据,但我需要把它或插入到 table 上以将它连接到其他 tables。
WITH monthss("MonthNumber") AS (
SELECT 0 FROM "DUMMY"
UNION ALL
SELECT 1 FROM "DUMMY"
UNION ALL
SELECT 2 FROM "DUMMY"
UNION ALL
SELECT 3 FROM "DUMMY"
UNION ALL
SELECT 4 FROM "DUMMY"
UNION ALL
SELECT 5 FROM "DUMMY"
UNION ALL
SELECT 6 FROM "DUMMY"
UNION ALL
SELECT 7 FROM "DUMMY"
UNION ALL
SELECT 8 FROM "DUMMY"
UNION ALL
SELECT 9 FROM "DUMMY"
UNION ALL
SELECT 10 FROM "DUMMY"
UNION ALL
SELECT 11 FROM "DUMMY"
UNION ALL
SELECT 12 FROM "DUMMY"
UNION ALL
SELECT 13 FROM "DUMMY"
)
SELECT
ADD_MONTHS(current_date, -"MonthNumber") AS "Date"
FROM monthss
OP 查询的目的似乎是创建一个辅助 table(辅助程序 table),其中包含今天和前 13 个月的日期。
输出是这样的(if current_date
returns 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
技术确实有效,但编写和维护起来很乏味,只对小结果集有效并且非常冗长。更糟糕的是 - IMO - 它专注于构建结果集的 "how",而不是 "what" 和 "why".
幸运的是,还有其他选择。
选项 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 特定的内置日历 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;
虽然可读性较差,但在我看来,它仍然比原来的方法更好、更灵活。
另请注意,这需要 table 已被填充(通过 "generate time data")才能工作。
现在,这两种方法都只生成结果集,但 OP 询问如何将这些存储到临时 tables 中。
显而易见的第一个答案是,这两个语句都可以与 INSERT
结合使用。
但是,我建议不要这样做。
使用选项 2) 数据已经在 table 中。
如果生成范围的查询应该在几个独立的语句中重复使用,那么创建一个 SQL 视图会有所帮助(并且是正确的做法)。
如果那些原本会使用临时 table 的独立语句恰好是 SQLScript 块的一部分,那么更好的选择是简单地将查询结果分配给table 变量并在整个 SQL 脚本块中引用该 table 变量。
如何将此结果放入 HANA 中的临时 table?我是 HANA 的新手。现在它 return 正确的数据,但我需要把它或插入到 table 上以将它连接到其他 tables。
WITH monthss("MonthNumber") AS (
SELECT 0 FROM "DUMMY"
UNION ALL
SELECT 1 FROM "DUMMY"
UNION ALL
SELECT 2 FROM "DUMMY"
UNION ALL
SELECT 3 FROM "DUMMY"
UNION ALL
SELECT 4 FROM "DUMMY"
UNION ALL
SELECT 5 FROM "DUMMY"
UNION ALL
SELECT 6 FROM "DUMMY"
UNION ALL
SELECT 7 FROM "DUMMY"
UNION ALL
SELECT 8 FROM "DUMMY"
UNION ALL
SELECT 9 FROM "DUMMY"
UNION ALL
SELECT 10 FROM "DUMMY"
UNION ALL
SELECT 11 FROM "DUMMY"
UNION ALL
SELECT 12 FROM "DUMMY"
UNION ALL
SELECT 13 FROM "DUMMY"
)
SELECT
ADD_MONTHS(current_date, -"MonthNumber") AS "Date"
FROM monthss
OP 查询的目的似乎是创建一个辅助 table(辅助程序 table),其中包含今天和前 13 个月的日期。
输出是这样的(if current_date
returns 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
技术确实有效,但编写和维护起来很乏味,只对小结果集有效并且非常冗长。更糟糕的是 - IMO - 它专注于构建结果集的 "how",而不是 "what" 和 "why".
幸运的是,还有其他选择。
选项 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 特定的内置日历 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;
虽然可读性较差,但在我看来,它仍然比原来的方法更好、更灵活。
另请注意,这需要 table 已被填充(通过 "generate time data")才能工作。
现在,这两种方法都只生成结果集,但 OP 询问如何将这些存储到临时 tables 中。
显而易见的第一个答案是,这两个语句都可以与 INSERT
结合使用。
但是,我建议不要这样做。
使用选项 2) 数据已经在 table 中。 如果生成范围的查询应该在几个独立的语句中重复使用,那么创建一个 SQL 视图会有所帮助(并且是正确的做法)。
如果那些原本会使用临时 table 的独立语句恰好是 SQLScript 块的一部分,那么更好的选择是简单地将查询结果分配给table 变量并在整个 SQL 脚本块中引用该 table 变量。