0

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

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

4

3 回答 3

2

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

更长的答案: SQLScript 的 INSERT/UPDATE 命令实际上是 文档解释的“借用”SQL 命令。

检查 SQL INSERT 的文档,我们发现它支持子查询作为值的来源。

子查询术语被定义为 SQL SELECT 语句的一部分。检查SELECT 的文档表明它们是不同的<subquery><with_clause>不重叠的术语。

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

但是,您可以在 SQLScript 块的 INSERT 语句中使用 SQLScript表变量,这与 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;
于 2018-02-12T22:44:02.860 回答
0

SAP HANA 包括这种可能性,代码的顺序与 SQL Server 不同:

INSERT INTO EXAMPLE (ID)
 WITH cte1 AS (SELECT 1 AS ID FROM DUMMY)
 SELECT ID FROM cte1;
于 2019-11-12T12:07:05.373 回答
0

在许多情况下,您可以将 CTE 转换为 Sub-Select 语句

您可以使用以下

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

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

with cte as (
    select * from city
)
insert into city (city, countryid, citycode)
select
    city, countryid, citycode
from cte
于 2018-02-13T11:20:28.567 回答