在HANA中创建临时表,并使用WITH子句

时间:2020-02-06 14:06:13

标签: sql hana

如何将此结果放入HANA中的临时表?我是HANA的新手。现在它返回正确的数据,但是我需要将其放入或插入到表中以将其连接到其他表。

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

1 个答案:

答案 0 :(得分:1)

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技术确实有效,但是编写和维护却很繁琐,仅对较小的结果集有效,并且非常冗长。更糟糕的是,IMO-它专注于构建结果集的“方式”,而不是“什么”和“为什么”。

幸运的是,还有其他选择。

选项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的内置日历辅助表 _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;

尽管这在我看来不太容易理解,但与原始方法相比,它仍然更好,更灵活。
还要注意,这要求表已经被填充(通过 "generate time data" )才能工作。

现在,这两种方法都只产生结果集,但是OP要求如何将它们存储到临时表中。 显而易见的第一个答案是,两个语句都可以与INSERT组合。 但是,我建议完全不要这样做。

使用选项2)数据已在表中。 如果产生该范围的查询应在多个独立的语句中重用,则创建SQL视图将有所帮助(并且是正确的选择)。

如果那些原本会使用temp表的独立语句恰好是SQLScript块的一部分,那么更好的选择是将查询结果简单地分配给一个表变量,并在整个SQLScript中引用该表变量