1.3.2.3.10. GoldenDB-MySQL

1.3.2.3.10.1. select ... into ...

select ... into ... 语句的作用是将查询结果存储到一个变量、文件或新表中,是一种非标准的SQL,可在PL/SQL中使用。

语法

SELECT select_expr_list INTO variable FROM from_list

示例

-- 转换前Oracle SQL:
select col1,col2 into @a1,@a2 from test_unisql_into_table;
select col1,col2 into b1,b2 from test_unisql_into_table;

-- 转换后GoldenDB-MySQL:
SELECT `col1`,`col2` INTO @a1, @a2 FROM `test_unisql_into_table`
SELECT `col1`,`col2` INTO `b1`, `b2` FROM `test_unisql_into_table`

1.3.2.3.10.2. 层次查询

层次查询(Hierarchical Query)是一种具有特殊功能的查询语句,通过它能够将分层数据按照层次关系展示出来。

语法

SELECT [level,] [column,] expression...
FROM from_list
[where_clause]
[hierarchical_query_clause]
[group_by_clause]

hierarchical_query_clause::=
  start_with_clause connect_by_clause
| connect_by_clause start_with_clause

start_with_clause::=
    START WITH expression

connect_by_clause::=
    CONNECT BY [NOCYCLE] expression

警告

  1. 不支持CONNECT_BY_ISCYCLE、CONNECT_BY_ROOT、CONNECT_BY_ISLEAF

  2. 不支持和oracle(+)一起使用

  3. 不支持和pivot, unpivot函数一起使用

  4. 不支持SIBLINGS

  5. 不支持和with cte一起使用

  6. 不支持窗口函数和分析函数 OVER语法

  7. 不支持rownum

1.3.2.3.10.3. WITH CTE

语法

WITH cte_name1 AS (
    SELECT column1, column2, ...
    FROM table1
    [WHERE condition]
),
cte_name2 AS (
    SELECT column1, column2, ...
    FROM table2
    [JOIN table3 ON condition]
    [WHERE condition]
    [UNION ALL SELECT ...]
)
SELECT column_list
FROM cte_name1
[JOIN cte_name2 ON condition]
[WHERE condition]
[ORDER BY column_list];

警告

  1. 不支持在 CTE 中使用 FOR UPDATE 子句

  2. 不支持在同一 CTE 定义中多次引用自身

  3. 不支持递归 CTE

  4. 不支持在 over 函数使用 rank

  5. 不支持和 connect by 一起使用

  6. 仅支持SELECT、UPDATE、DELETE语句中的WITH CTE

  7. 不支持在CREATE TABLE语句中使用WITH CTE

  8. 支持的版本为6010310

示例

-- 转换前Oracle SQL:
WITH cte_employee AS (SELECT id, name, age FROM test_with_cte_20260423_1) SELECT * FROM cte_employee ORDER BY id;

-- 转换后GoldenDB-MySQL SQL:
WITH cte_employee AS (SELECT id,name,age FROM test_with_cte_20260423_1) SELECT * FROM cte_employee ORDER BY id

1.3.2.3.10.3.1. connect by

DROP TABLE unisql_connect_by_emp;
CREATE TABLE unisql_connect_by_emp (empno int NOT NULL,ename VARCHAR2(10),job VARCHAR2(9),mgr int,sal int,comm int,deptno int);

INSERT INTO unisql_connect_by_emp VALUES (7369,'SMITH','CLERK',7902,800,NULL,20);
INSERT INTO unisql_connect_by_emp VALUES (7499,'ALLEN','SALESMAN',7698,1600,300,30);
INSERT INTO unisql_connect_by_emp VALUES (7521,'WARD','SALESMAN',7698,1250,500,30);
INSERT INTO unisql_connect_by_emp VALUES (7566,'JONES','MANAGER',7839,2975,NULL,20);
INSERT INTO unisql_connect_by_emp VALUES (7654,'MARTIN','SALESMAN',7698,1250,1400,30);
INSERT INTO unisql_connect_by_emp VALUES (7698,'BLAKE','MANAGER',7839,2850,NULL,30);
INSERT INTO unisql_connect_by_emp VALUES (7782,'CLARK','MANAGER',7839,2450,NULL,10);
INSERT INTO unisql_connect_by_emp VALUES (7788,'SCOTT','ANALYST',7566,3000,NULL,20);
INSERT INTO unisql_connect_by_emp VALUES (7839,'KING','PRESIDENT',NULL,5000,NULL,30);
INSERT INTO unisql_connect_by_emp VALUES (7844,'TURNER','SALESMAN',7698,1500,0,30);
INSERT INTO unisql_connect_by_emp VALUES (7876,'ADAMS','CLERK',7788,1100,NULL,20);
INSERT INTO unisql_connect_by_emp VALUES (7900,'JAMES','CLERK',7698,950,NULL,30);
INSERT INTO unisql_connect_by_emp VALUES (7902,'FORD','ANALYST',7566,3000,NULL,20);
INSERT INTO unisql_connect_by_emp VALUES (7934,'MILLER','CLERK',7782,1300,NULL,10);

-- 转换前Oracle SQL:
-- 单表
SELECT LEVEL,empno,ename,mgr,sal,connect_by_root(DEPTNO) AS root,SYS_CONNECT_BY_PATH(LEVEL, '/') FROM unisql_connect_by_emp START WITH ename='BLAKE' CONNECT BY PRIOR empno=mgr

LEVEL|EMPNO|ENAME |MGR |SAL |ROOT|SYS_CONNECT_BY_PATH(LEVEL,'/')|
-----+-----+------+----+----+----+------------------------------+
    1| 7698|BLAKE |7839|2850|  30|/1                            |
    2| 7499|ALLEN |7698|1600|  30|/1/2                          |
    2| 7521|WARD  |7698|1250|  30|/1/2                          |
    2| 7654|MARTIN|7698|1250|  30|/1/2                          |
    2| 7844|TURNER|7698|1500|  30|/1/2                          |
    2| 7900|JAMES |7698| 950|  30|/1/2                          |

-- 转换后GoldenDB-MySQL SQL:
SELECT LEVEL,empno,ename,mgr,sal,connect_by_root(DEPTNO) AS root,SYS_CONNECT_BY_PATH(LEVEL, '/') FROM unisql_connect_by_emp START WITH ename='BLAKE' CONNECT BY PRIOR empno=mgr

level|empno|ename |mgr |sal |root|sysconnectpath|
-----+-----+------+----+----+----+--------------+
    1| 7698|BLAKE |7839|2850|  30|/1            |
    2| 7499|ALLEN |7698|1600|  30|/1/2          |
    2| 7521|WARD  |7698|1250|  30|/1/2          |
    2| 7654|MARTIN|7698|1250|  30|/1/2          |
    2| 7844|TURNER|7698|1500|  30|/1/2          |
    2| 7900|JAMES |7698| 950|  30|/1/2          |