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;
我知道这不是特定的代码或问题,但我遇到了与提问者非常相似的问题(除了他们的问题是针对 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;