2.7.2.1. GaussDB-Oracle 目标库
本节描述 伪多发 GaussDB-Oracle 目标库的 SQL 兼容情况说明。
目前兼容 505.2 版本。
2.7.2.1.1. MERGE 语句
语法结构
MERGE INTO [ schema. ] { table | view } [ t_alias ]
USING { [ schema. ] { table | view }
| subquery
} [ t_alias ]
ON ( condition )
[ merge_update_clause ]
[ merge_insert_clause ];
merge_update_clause:
WHEN MATCHED THEN
UPDATE SET column = { expr | DEFAULT }
[, column = { expr | DEFAULT } ]...
[ where_clause ]
[ DELETE where_clause ]
merge_insert_clause:
WHEN NOT MATCHED THEN
INSERT [ ( column [, column ]... ) ]
VALUES ( { expr [, expr ]... | DEFAULT } )
[ where_clause ]
subquery:
SELECT [ DISTINCT | ALL ] select_expr_list
[ FROM from_list ]
[ WHERE condition ]
[ GROUP BY group_expression_list [ HAVING condition ] ]
[ ORDER BY order_expression_list ]
[ FOR UPDATE [ OF column ]
[ { NOWAIT | WAIT integer | SKIP LOCKED } ] ]
[ row_limiting_clause ]
select_expr_list:
table_name.*
| table_alias_name.*
| expr [ [ AS ] column_alias_name ]
from_list:
DUAL
| table_reference [, table_reference ... ]
table_reference:
simple_table
| joined_table
| pivot_clause
| unpivot_clause
simple_table:
table_name [ table_alias_name ]
| ( select_stmt ) [ table_alias_name ]
| ( table_reference_list )
joined_table:
table_reference [ INNER ] JOIN simple_table [ join_condition ]
| table_reference outer_join_type JOIN simple_table join_condition
outer_join_type:
{ LEFT | RIGHT | FULL } [ OUTER ]
join_condition:
ON expression
group_expression_list:
group_expression [, group_expression ... ]
group_expression:
expression
order_expression_list:
order_expression [, order_expression ... ]
order_expression:
expression [ ASC | DESC ]
row_limiting_clause:
[ OFFSET offset { ROW | ROWS } ]
[ FETCH { FIRST | NEXT } [ { rowcount } ] { ROW | ROWS } { ONLY } ]
pivot_clause:
PIVOT (
aggregate_function ( expr ) [ [ AS ] alias ]
[, aggregate_function ( expr ) [ [ AS ] alias ] ... ]
pivot_for_clause
pivot_in_clause
)
pivot_for_clause:
FOR { column }
pivot_in_clause:
IN (
{ { expr | ( expr [, expr ... ] ) } [ [ AS ] alias ] ... }
[, { { expr | ( expr [, expr ... ] ) } [ [ AS ] alias ] ... } ]
)
unpivot_clause:
UNPIVOT (
{ column }
pivot_for_clause
unpivot_in_clause
)
unpivot_in_clause:
IN (
{ column | ( column [, column ... ] ) }
)
操作模式
MERGE 语句支持以下操作组合:
只更新(仅 WHEN MATCHED)
只插入(仅 WHEN NOT MATCHED)
更新 + 插入(同时包含 WHEN MATCHED 和 WHEN NOT MATCHED)
不支持的语法特性
带序列(sequence)的 INSERT 不准确
Oracle 中使用
sequence.NEXTVAL的 MERGE 语句转换不准确:MERGE INTO t1 t USING ( SELECT seq_test.NEXTVAL AS new_id, dept_id FROM t2 ) s ON (t.id = s.dept_id) WHEN NOT MATCHED THEN INSERT (id, department_id) VALUES (s.new_id, s.dept_id);
限制说明:USING 子查询中的
sequence.NEXTVAL无法被转换,所以查询结果可能不准确。子查询后不能跟 PIVOT 或 UNPIVOT
使用 PIVOT 或 UNPIVOT 的子查询作为 MERGE 的源数据时不支持:
SELECT * FROM ( SELECT emp_id, income_type, amount FROM t ) PIVOT ( SUM(amount) FOR income_type IN ('BASE', 'BONUS') );
限制说明:MERGE 的 USING 子句可以包含 PIVOT 或 UNPIVOT 操作,但 FROM 不能是子查询。
UNPIVOT 中不能使用 AS 常量
UNPIVOT 子句中不支持使用
AS指定常量:UNPIVOT ( amount FOR income_type IN ( base_salary AS 'BASE', bonus AS 'BONUS' ) )
限制说明:UNPIVOT 的 IN 子句中不支持
AS '常量'的写法。不支持 FALSE 表达式 + DUAL + UPDATE 的 MERGE
使用
DUAL表和虚假条件(如1 = 0)的 MERGE 语句不支持:MERGE INTO table t USING DUAL ON (1 = 0) WHEN NOT MATCHED THEN INSERT ...
限制说明:当使用
DUAL作为源表且条件永远为 FALSE 时,多发比对将无法匹配到有效结果。
2.7.2.1.2. SELECT 语句
(待详细补充...)
2.7.2.1.3. INSERT 语句
(待详细补充...)
2.7.2.1.4. UPDATE 语句
(待详细补充...)
2.7.2.1.5. DELETE 语句
(待详细补充...)