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.2. KINGBASE-ORACLE 目标库
2.7.2.2.1. MERGE 语句
语法结构
单表插入:
[ with_query_clause ] insert_into_clause
{ values_clause }
[ on_conflict_clause ]
[ returning_clause]
with_query_clause:
WITH [ RECURSIVE ] with_query [, ...]。
with_query详细格式为:
with_query_name [ ( column_name [, ...] ) ] AS
( {select | values | insert | update | delete} )
insert_into_clause:
INSERT INTO table_name
[ [ AS ] alias ] | sub_query [alias]
[ ( column_name [, ...] ) ]
values_clause:
VALUES ( { expression } [, ...] ) [, ...] |query)
query语法:
[ WITH [ RECURSIVE ] with_query [, ...] ]
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] | UNIQUE [ ON ( expression [, ...] ) ] ]
[ * | expression [ [ AS ] output_name ] [, ...] ]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY grouping_element [, ...] ]
[ HAVING condition [, ...] ]
[ { UNION | INTERSECT | EXCEPT | MINUS } [ ALL | DISTINCT ] SELECT ]
[ ORDER BY expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] ]
[ LIMIT { count | ALL } ]
[ OFFSET start [ ROW | ROWS ] ]
[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]
[ FOR { UPDATE } [ OF table_name[, ...] ]
[ NOWAIT | SKIP LOCKED | WAIT seconds] [...] ]
from_item:
{table_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
|( select ) [ AS ] alias [ ( column_alias [, ...] ) ]
|with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
|from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]}
condition ::=
simple_comparison
| group_comparison
| logical_condition
| pattern_match_condition
| null_condition
| between_condition
| exists_condition
| in_condition
| composite_condition
simple_comparison ::=
expression {= | != | ^= | <> | > | < | >= | <=} expression
group_comparison ::=
expression {= | != | ^= | <> | > | < | >= | <=} {ANY | SOME | ALL}
({expression_list | subquery})
logical_condition ::=
NOT condition
| condition AND condition
| condition OR condition
pattern_match_condition ::=
expression [NOT] LIKE expression [ESCAPE expression]
| expression [NOT] ILIKE expression [ESCAPE expression]
| expression [NOT] SIMILAR TO expression [ESCAPE expression]
| REGEXP_LIKE(source_char, pattern [, match_param])
null_condition ::=
expression IS [NOT] NULL
between_condition ::=
expression [NOT] BETWEEN expression AND expression
exists_condition ::=
[NOT] EXISTS (subquery)
in_condition ::=
expression [NOT] IN ({expression_list | subquery})
| (expression [, ...]) [NOT] IN (subquery)
composite_condition ::=
(condition)
| NOT condition
| condition {AND | OR} condition
expression_list ::=
expression [, expression ...]
on_conflict_clause:
ON CONFLICT [ conflict_target ] conflict_action
conflict_target:
( { index_column_name | ( index_expression ) }
[, ...] ) [ WHERE index_predicate ]
ON CONSTRAINT constraint_name
conflict_action:
DO NOTHING
DO UPDATE SET { column_name = { expression | DEFAULT } |
( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT }
[, ...] ) |
( column_name [, ...] ) = ( sub-SELECT )
} [, ...]
[ WHERE condition ]
returning_clause:
RETURNING * | output_expression [ [ AS ] output_name ] [, ...]
2.7.2.2.2. DELETE 语句
语法结构
[ WITH [ RECURSIVE ] with_query [, ...] ]
DELETE FROM [ ONLY ] table_name [ [ AS ] alias ]
[ USING using_list ]
[ WHERE condition ]
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
with_query:
with_query_name [ ( column_name [, ...] ) ] AS
( {select | values | insert | update | delete} )
2.7.2.2.3. UPDATE 语句
语法结构
[ WITH [ RECURSIVE ] with_query [, ...] ]
UPDATE table_name [ [ AS ] alias ]
SET {{ column_name = { expression | DEFAULT } |
( column_name [, ...] ) = ( sub-SELECT )
} [, ...] }
[ FROM from_list ]
[ WHERE condition]
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
with_query:
with_query_name [ ( column_name [, ...] ) ] AS
( {select | values | insert | update | delete} )
from_list:
{table_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
|( select ) [ AS ] alias [ ( column_alias [, ...] ) ]
|with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
| from_list [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]}
2.7.2.2.4. MERGE 语句
语法结构
MERGE INTO [ schema. ] { target_table } [ [ AS ] target_table_alias ]
USING { [ schema. ] { source_table } [ [ AS ] source_table_alias ]
ON ( condition_expression )
[ merge_update_clause ]
[ merge_insert_clause ]
merge_update_clause:
WHEN MATCHED THEN
UPDATE SET column = { expr }[, column = { expr } ]...
[ where_clause ]
[ delete_clause ]
delete_clause:
[DELETE where_clause]
merge_insert_clause:
WHEN NOT MATCHED THEN
INSERT [ ( column [, column ]...) ]
VALUES ({ expr }[, { expr]...)
[ where_clause ]
2.7.2.3. GOLDENDB_MYSQL 目标库
2.7.2.3.1. INSERT 语句
语法结构
INSERT [IGNORE]
INTO tbl_name
[(col_name [, col_name] ...)]
{ {VALUES } (value_list) [, (value_list)] ... }
[ON DUPLICATE KEY UPDATE assignment_list]
INSERT [IGNORE]
INTO tbl_name
[(col_name [, col_name] ...)]
{ SELECT ...
| TABLE table_name
}
[ON DUPLICATE KEY UPDATE assignment_list]
value:
{expr }
value_list:
value [, value] ...
assignment:
col_name =
value
assignment_list:
assignment [, assignment] ...
2.7.2.3.2. INSERT ALL 语句
语法结构
INSERT ALL
INTO table_name VALUES (固定值1, 固定值2, ...)
INTO table_name VALUES (固定值3, 固定值4, ...)
…
SELECT … FROM DUAL;
2.7.2.3.3. REPLACE 语句
语法结构
语法1:
REPLACE
INTO tbl_name
[(col_name [, col_name] ...)]
{ {VALUES } (value_list) [, (value_list)] ...
}
语法2:
REPLACE
INTO tbl_name
[(col_name [, col_name] ...)]
{SELECT ... | TABLE table_name}
value:
{expr }
value_list:
value [, value] …
assignment:
col_name = value
assignment_list:
assignment [, assignment] ...
2.7.2.3.4. DELETE 语句
语法结构
单表:
DELETE [IGNORE] FROM table_name [[AS] table_alias]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
注:只有ORDER BY,没有LIMIT的情况,不考虑
多表(两表):
DELETE [IGNORE]
tbl_name [, tbl_name] ...
FROM table_references
[WHERE where_condition]
table_references: 涉及的表及其连接条件
2.7.2.3.5. UPDATE 语句
语法结构
UPDATE单表:
UPDATE [IGNORE] table_reference
SET assignment_list
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
UPDATE多表(支持两表):
UPDATE [IGNORE] table_references
SET assignment_list
[WHERE where_condition]
table_references:指示要从中检索行的一个或多个表。
assignment_list:
assignment [, assignment] ...
2.7.2.3.6. MERGE 语句
语法结构
MERGE INTO [ schema.] { table } [ t_alias ]
USING { [ schema. ] { table}
| select…
} [ t_alias ]
ON ( condition )
[ merge_update_clause ]
[ merge_insert_clause ];
merge_update_clause:
WHEN MATCHED THEN
UPDATE SET column = { expr }
[, column = { expr } ]...
[ where_clause ]
merge_insert_clause:
WHEN NOT MATCHED THEN
INSERT [ (column [, column ]...) ]
VALUES ({ expr [, expr ]... })
[ where_clause ]
注:支持更新+插入/只更新/只插入
2.7.2.4. OCEAN_BASE_ORACLE 目标库
2.7.2.4.1. INSERT 语句
语法结构
INSERT { single_table_insert | multi_table_insert }
single_table_insert:
{ INTO insert_table_clause '(' column_list ')' values_clause [{ RETURNING | RETURN } returning_exprs]
}
column_list:
column_definition_ref [, column_definition_ref...]
returning_exprs:
projection_col_name [,projection_col_name ...]
values_clause:
VALUES ({ expr } [, { expr } ]... )
returning_exprs:
projection [, projection...]
multi_table_insert:
{ ALL { insert_into_clause [ values_clause ] }
| conditional_insert_clause
} subquery
conditional_insert_clause:
[ ALL | FIRST ]
WHEN condition
THEN insert_into_clause
[ values_clause ]
[ insert_into_clause [ values_clause ] ]...
[ WHEN condition
THEN insert_into_clause
[ values_clause ]
[ insert_into_clause [ values_clause ] ]...
]...
[ ELSE insert_into_clause
[ values_clause ]
[ insert_into_clause [ values_clause ] ]...
]
subquery::
SELECT [ { { DISTINCT | UNIQUE } | ALL } ] select_list
FROM { table_reference | join_clause | ( join_clause ) }
[ , { table_reference | join_clause | (join_clause) } ]
[ where_clause ]
[ hierarchical_query_clause ]
[ group_by_clause ]
| subquery { UNION [ALL] | INTERSECT | MINUS } subquery [ { UNION [ALL] | INTERSECT | MINUS } subquery ]
| ( subquery ) [ order_by_clause ] [ row_limiting_clause ]
hierarchical_query_clause:
SELECT [level], column, expr... FROM table [WHERE condition] [ START WITH start_expression ]
CONNECT BY [NOCYCLE] { PRIOR child_expr = parent_expr | parent_expr = PRIOR child_expr }
[ GROUP BY ... ] [ HAVING ... ] [ ORDER BY ... ]
2.7.2.4.2. DELETE 语句
语法结构
DELETE FROM table_factor
[WHERE where_expression]
[{ RETURNING | RETURE } returning_exprs]
table_factor:
{table_name | '(' table_reference ')' }
returning_exprs:
projection_col_name [,projection_col_name ...]
2.7.2.4.3. UPDATE 语句
语法结构
UPDATE dml_table_clause
SET update_asgn_list
[ WHERE where_condition]
[{ RETURNING | RETURN } returning_exprs]
dml_table_clause:
dml_table_name opt_table_alias
update_asgn_list:
column_name = expr [, expr...]
where_condition:
expression
returning_exprs:
projection_col_name [,projection_col_name ...]
2.7.2.4.4. MERGE 语句
语法结构
MERGE INTO target_table_name [opt_alias]
USING source_table_name [opt_alias]
ON (expr)
[merge_update_clause] [merge_insert_clause]
merge_update_clause:
WHEN MATCHED THEN UPDATE SET update_asgn_list [WHERE expr] [DELETE WHERE expr]
merge_insert_clause:
WHEN NOT MATCHED THEN INSERT opt_insert_columns VALUES '(' insert_vals ')' [WHERE expr]
2.7.2.5. TDSQL_MYSQL 目标库
2.7.2.5.1. INSERT 语句
语法结构
INSERT [IGNORE]
INTO tbl_name
[(col_name [, col_name] ...)]
{ {VALUES } (value_list) [, (value_list)] ... }
[ON DUPLICATE KEY UPDATE assignment_list]
INSERT [IGNORE]
INTO tbl_name
[(col_name [, col_name] ...)]
{ SELECT ...
| TABLE table_name
}
[ON DUPLICATE KEY UPDATE assignment_list]
value:
{expr }
value_list:
value [, value] ...
assignment:
col_name =
value
assignment_list:
assignment [, assignment] ...
注:ON DUPLICATE KEY UPDATE assignment_list中仅支持values。
2.7.2.5.2. REPLACE 语句
语法结构
REPLACE
INTO tbl_name
[(col_name [, col_name] ...)]
{ {VALUES } (value_list) [, (value_list)] ...
}
REPLACE
INTO tbl_name
[(col_name [, col_name] ...)]
{SELECT ... | TABLE table_name}
value:
{expr }
value_list:
value [, value] …
assignment:
col_name = value
assignment_list:
assignment [, assignment] ...
2.7.2.5.3. DELETE 语句
语法结构
DELETE单表:
DELETE [IGNORE] FROM table_name [[AS] table_alias]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
注:只有ORDER BY,没有LIMIT的情况,不考虑
DELETE多表:
DELETE [IGNORE]
tbl_name [, tbl_name] ...
FROM table_references
[WHERE where_condition]
2.7.2.5.4. UPDATE 语句
语法结构
UPDATE单表:
UPDATE [IGNORE] table_reference
SET assignment_list
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
UPDATE多表:
UPDATE [IGNORE] table_references
SET assignment_list
[WHERE where_condition]