SAP HANA 的 SQLScript 是否支持将 INSERT 与 CTE(通用 Table 表达式)结合使用?

Does SQLScript for SAP HANA support the use of INSERT with CTEs (Common Table Expressions)?

我知道这不是特定的代码或问题,但我遇到了与提问者非常相似的问题(除了他们的问题是针对 SQL 服务器):Combining INSERT INTO and WITH/CTE ...而且我似乎无法在任何 SAP HANA 帮助论坛等上找到它。所以认为这里可能有专家可以给我一个简单的是或否的答案。

我正在使用的 SQL 语句包含 多个 CTE,但是当我尝试插入时它告诉我 INSERT 一词周围存在语法错误。它的布局绝对与我上面链接的问题完全相同(花了几个小时检查),如果需要,我可以 post 代码示例,但我只是想先知道它是否受支持!谢谢

简答: 不,INSERT/UPDATE 语句不支持 CTE。

更长的答案: SQL脚本的 INSERT/UPDATE 命令实际上是 "borrowed" SQL 命令,如 documentation explains

检查 SQL INSERT 的文档,我们发现它 supports a subquery 作为值的来源。

子查询项定义为 SQL SELECT 语句的一部分。检查 documentation for SELECT 表明 <subquery><with_clause> 是不同的、不重叠的术语。

这意味着 CTE 不能用于子查询,因此不能成为 INSERT/UPDATE 命令中使用的子查询的一部分。

但是,您可以在 SQLScript 块的 INSERT 语句中使用 SQLScript table 变量,这非常相似CTE:

DO BEGIN
  te_a := SELECT 10, 'xyz' as VAL from dummy;
  te_b := SELECT 20, 'abc' as VAL from dummy;

  te_all :=     SELECT * from :te_a
      UNION ALL SELECT * from :te_b;

  INSERT INTO VALS 
             (SELECT * from :te_all);

END;

很多情况下可以将CTE转换成Sub-Select语句

您可以使用以下

insert into city (city, countryid, citycode)
select
    city, countryid, citycode
from (
    -- CTE Expression as subselect
    select * from city
    -- end (CTE)
) cte

而不是使用以下有效的 CTE 命令结合 INSERT(在 SQL 服务器上)

with cte as (
    select * from city
)
insert into city (city, countryid, citycode)
select
    city, countryid, citycode
from cte

SAP HANA 包含此可能性,代码顺序不同于 SQL 服务器:

INSERT INTO EXAMPLE (ID)
 WITH cte1 AS (SELECT 1 AS ID FROM DUMMY)
 SELECT ID FROM cte1;