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.2.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          |