(1) INSERT ALL/FIRST 子句语法 功能描述: INSERT ALL 是指将同一批数据插入到符合条件的若干张表中,INSERT FIRST 是指将 同一批数据插入到第一个符合条件的表中。也就是说,当表达式第一个条件为TRUE 之 后,INSERT FIRST 会跳过后面的条件并结束插入,而INSERT ALL 会继续执行接下来若干 条件为TRUE 的操作。
What’s new in GBase 8s V8.8
南大通用数据技术股份有限公司 8/60
语法:
使用说明: INSERT ALL/FIRST 包括如下子句: 1. ALL/FIRST 关键字: ALL/FIRST 关键字省略时为ALL, ALL 和FIRST 不能同时出现。 2. WHEN condition 条件表达式:condition 是返回结果为布尔类型的算数表达式, 不支持省略,支持一个或多个条件表达式,多个表达式可用AND、OR 等逻辑 运算符和谓词连接。表达式中出现的列名必须是subquery 子句返回的列,运 算符两边都支持列名。 3. THEN into 子句:表示条件满足时,将数据插入到into 子句的表中,into 子句 不支持省略。 into 子句支持在表后括号中罗列本表列名, 列名省略时表示需要 对表中所有列依次顺序插入数据。 4. values 子句:用于指定需要插入的值,支持列名、函数、运算符、常量值等形 式,此处的列名为subquery 子句返回的列,如果subquery 子句对投影列使用 了别名,则values 子句中的列名指的是subquery 子句中投影列的别名。 注意: i. 如果into 子句的表中本次插入值的列的数量少于subquery 子句返回列的数 量,则需要在into 子句表后括号中罗列列名并在values 子句中指定需要插入 的值。 ii. values 子句支持省略,省略时,into 子句中表列的数量需要和subquery 子句 返回的列数量一致。 5. WHEN…THEN…支持多次出现:WHEN…THEN…组合使用时,当表达式第一个 条件为TRUE 之后,INSERT FIRST 会跳过后面的条件并结束插入,而INSERT ALL 会继续执行接下来若干条件为TRUE 的操作。 6. ELSE 子句: 当WHEN 子句根据条件表达式判断为假而都没有执行后, 执行ELSE 子句中的into 子句部分,其用法同WHEN 子句中的。ELSE 子句支持省略。
What’s new in GBase 8s V8.8
南大通用数据技术股份有限公司 9/60
7. subquery 子句:subquery 子句返回的是一个数据集,支持SELECT…FROM…、 WHERE、UNION 等,具体用法可参考SQL 相关标准。 注意: i. subquery 返回列的类型需要与into 子句中表列的类型匹配,即需要类型一致 或者符合隐式转换规则。 举例: CREATE TABLE testtb1(a1 int, a2 int); CREATE TABLE testtb2(b1 int, b2 int); CREATE TABLE testtb3(c1 int, c2 int); CREATE TABLE testtb(col1 int, col2 int); INSERT INTO testtb VALUES(1, 1); INSERT INTO testtb VALUES(2, 2); INSERT INTO testtb VALUES(3, 3); INSERT INTO testtb VALUES(4, 4); INSERT FIRST WHEN col1 > 3 THEN INTO testtb1 (a1, a2) VALUES (col1, col2) WHEN col1 > 2 THEN INTO testtb2 (b1, b2) VALUES (col1, col2) ELSE INTO testtb3 (c1, c2) VALUES (col1, col2) SELECT col1,col2 FROM testtb; INSERT ALL WHEN col1 > 3 THEN INTO testtb1 WHEN col1 > 2 THEN INTO testtb2 ELSE INTO testtb3 SELECT col1,col2 FROM testtb;
(2) WITH FUNCTION 子句语法 功能描述: 兼容ORACLE 的WITH FUNCTION 语法, 允许在WITH 语法中定义一个或多个PL/SQL 函数,并在后续的SELECT 语句中使用调用该函数。 为提供更好的Oracle 兼容性,WITH FUNCTION 的语法结构和使用方式,与ORACLE 中的WITH FUNCTION 保持一致,即在WITH FUNCTION 中定义的函数,其生命周期仅限 于本条SQL 执行期间, 无法在数据库任何系统表中查询到该函数相关信息, 也不允许其 它SQL 语句调用该函数。
What’s new in GBase 8s V8.8
南大通用数据技术股份有限公司 10/60
语法:
plsql_declarations:==
注:上图中,本版本只实现红色方框内分支语法 body:==
参数说明: 1. WITH:语法关键词,不可省略; 2. FUNCTION RETURN IS:函数heading,固定格式, 不可省略; 3. BEGIN ... END:函数body,固定格式,不可省略; 4. :函数逻辑功能实现,其语法规则与GBase 8s 当前版本所支持的 PL/SQL 语法规则保持一致; 举例: CREATE TABLE t1(id number); INSERT INTO t1 VALUES(12); --test 1 with func \set SQLTERM / WITH FUNCTION with_func_1(p_id in number) RETURN number IS BEGIN RETURN p_id; END; SELECT with_func_1(id) FROM t1 / WITH PROCEDURE with_proc_1(p_id in number) IS BEGIN RAISE NOTICE 'p_id =%d', p_id; END; SELECT id FROM t1 /
What’s new in GBase 8s V8.8
南大通用数据技术股份有限公司 11/60
WITH FUNCTION with_func_1(p_id in number) RETURN number IS BEGIN RETURN p_id; END; FUNCTION with_func_2(p_id in number) RETURN number IS BEGIN RETURN p_id + 100; END; SELECT with_func_1(id),with_func_2(id) FROM t1;
(3) WITH AS 子句语法 功能描述: 使用WITH AS 语句可定义子查询别名和列别名, 并可在其他子查询和select 查询块 引用该别名。定义的别名作用域仅限于紧跟在WITH AS 之后的select 查询块的单次查 询,查询后失效。在select 查询块未定义关联条件下,查询语句的结果集为各子查询结 果的笛卡尔积。 语法: WITH <子查询别名 [(<列名>{,<列名>})] AS(子查询)> [,<子查询别名 [(<列名>{,<列名>})] AS(子查询)>] select 查询块 使用说明: 1. 子查询别名支持的字符与现有系统表名保持一致; 2. 支持with 子句的子查询数量为一个或多个; 3. 支持with 子句的子查询可不罗列列别名,不罗列列别名时,列名与子查询投 影列列名保持一致; 4. 支持with子句的子查询名称可与当前模式下基础表或基础视图重名, 重名时, 均被当做子查询别名处理。 5. with 子句定义的名称, 其生命周期为紧邻WITH AS 语句之后的select 语句查询 块查询后结束, 且查询一次后就失效。 with 子句中无法访问到其他模式的基础 表或基础视图; 6. 支持with 子句的子查询为多个使用集合运算符联结(UNION ALL、UNION、 EXCEPT 或 INTERSECT)的select 查询语句,且集合运算符的查询语句不能使 用with 定义的子查询别名。子查询别名没有指定列,子查询包含UNION ALL 等词语时,结果集的列名字与现有UNION ALL 等语句保持一致;
What’s new in GBase 8s V8.8
南大通用数据技术股份有限公司 12/60
7. 支持with 子句的定义的子查询别名,在查询块未使用; 8. 支持with 子句的多个子查询可引用已定义的子查询别名,且只能先定义后引 用; 9. 支持select 查询块嵌套WITH AS; 10. 支持with 子句在批处理的语句中使用; 11. 支持在delete、insert…select、update 子句中使用; 12. 使用WITH AS 定义子查询别名时,支持使用function 定义函数。支持with 语 句中有多条function 语句和多条as 语句, function 语句必须放在as 语句之前, as 语句可以使用function 定义的函数,两类语句不允许穿插。as 定义子查询 别名支持与function 语句重名。 定义CTE 的语法格式: WITH expression_name [(column_name [,...n] )] AS (cte_query_definition) 举例说明: WITH cr AS (SELECT CountryRegionCode FROM person.CountryRegion WHERE Name LIKE 'C%' ) SELECT * FROM person.StateProvince WHERE CountryRegionCode IN (SELECT * FROM cr) 其中cr 是一个公用表表达式,该表达式在使用上与表变量类似,只是SQL Server 在处理公用表表达式的方式上有所不同。
(4) ROLLUP、CUBE 和 GROUPING SETS 分组统计语法 GROUP BY 的分组项支持:expr 值表达式、ROLLUP 子句、CUBE 子句、GROUPING SETS 子句。 语法: