摘要:本文提供一种GaussDB DWS迁移CONNECT BY语法方案。

本文分享自华为云社区《GaussDB(DWS)迁移 - oracle兼容 -- CONNECT BY迁移》,作者: 譡里个檔 。

CONNECT BY NOCYCLE

1) 预置对象定义

DROP SCHEMA IF EXISTS "sdifin" CASCADE;
CREATE SCHEMA "sdifin";
DROP TABLE IF EXISTS "sdifin"."ogg_ets_bas_instrument_t_2670";
SET search_path = sdifin;
CREATE TABLE ogg_ets_bas_instrument_t_2670 (
bas_instrument_id numeric NOT NULL,
instrument_name character varying(600),
instrument_parent_id numeric,
status numeric
)
WITH (enable_hstore=on, orientation=column, compression=yes, enable_delta=false, colversion=2.0, max_batchrow=60000)
DISTRIBUTE BY HASH(bas_instrument_id);
DROP TABLE IF EXISTS "sdifin"."ogg_sectype_2360";
SET search_path = sdifin;
CREATE TABLE ogg_sectype_2360 (
thekey character varying(18) NOT NULL,
name character varying(150)
)
WITH (enable_hstore=on, orientation=column, compression=yes, enable_delta=false, colversion=2.0, max_batchrow=60000)
DISTRIBUTE BY REPLICATION;

2) oracle原始语句

SELECT
to_char(i.BAS_INSTRUMENT_ID) AS INSTRUMENT_ID,
to_char(i.INSTRUMENT_PARENT_ID) AS parent_thekey,
TRIM(i.INSTRUMENT_NAME) AS INSTRUMENT_NAME,
SYS_CONNECT_BY_PATH(i.INSTRUMENT_NAME, ';') AS INSTRUMENT_PATH,
SYS_CONNECT_BY_PATH(i.BAS_INSTRUMENT_ID, '->') AS BAS_ID_PATH,
LEVEL AS INSTRUMENT_LEVEL,
CONNECT_BY_ISCYCLE AS CYCLE_ERROR,
2670 AS ss_id
FROM OGG_ETS_BAS_INSTRUMENT_T_2670 i, OGG_SECTYPE_2360 s2
WHERE upper(i.instrument_name) = upper(TRIM(s2.name(+)))
AND s2.thekey IS NULL AND I.STATUS = 1
CONNECT BY NOCYCLE PRIOR i.BAS_INSTRUMENT_ID = i.INSTRUMENT_PARENT_ID
START WITH i.instrument_parent_id IS NULL

oracle中的执行计划

关键点:

1)语句特征:SQL语句中WHERE字句包含非关联条件

2)执行特征:WHERE字句中的非关联条件计算的优先级低于CONNECT BY,即CONNECT BY执行之后才会进行这些条件的过滤,如上id=2的FILTER条件

3) DWS等价改写逻辑

WITH RECURSIVE TMP_ETC AS (
SELECT
to_char(i.bas_instrument_id) AS instrument_id,
to_char(i.instrument_parent_id) AS parent_thekey,
trim(i.instrument_name) AS instrument_name,
';'||i.instrument_name AS instrument_path,
'->'||i.bas_instrument_id AS bas_id_path,
1 AS instrument_level,
0 AS cycle_error,
2670 AS ss_id,
s2.thekey,
i.status,
i.bas_instrument_id AS start_val
FROM sdifin.ogg_ets_bas_instrument_t_2670 i
LEFT JOIN sdifin.ogg_sectype_2360 s2 ON upper(trim(i.instrument_name)) = upper(trim(s2.name))
WHERE i.instrument_parent_id IS NULL
UNION ALL
SELECT
to_char(i.bas_instrument_id) AS instrument_id,
to_char(i.instrument_parent_id) AS parent_thekey,
trim(i.instrument_name) AS instrument_name,
(b.instrument_path ||';'||i.instrument_name) AS instrument_path,
(b.bas_id_path ||'->'||i.bas_instrument_id) AS bas_id_path,
b.instrument_level+1 AS instrument_level,
decode(trim(i.bas_instrument_id)=b.start_val,false,0,1) AS cycle_error,
2670 AS ss_id,
s2.thekey,
i.status,
b.start_val AS start_val
FROM sdifin.ogg_ets_bas_instrument_t_2670 i
LEFT JOIN sdifin.ogg_sectype_2360 s2 ON upper(i.instrument_name) = upper(trim(s2.name))
INNER JOIN tmp_etc b ON b.instrument_id = i.instrument_parent_id
WHERE b.cycle_error <> 1
)
SELECT
instrument_id,
parent_thekey,
instrument_name,
instrument_path,
bas_id_path,
instrument_level,
cycle_error,
ss_id
FROM tmp_etc
WHERE thekey IS NULL
AND status = 1

点击关注,第一时间了解华为云新鲜技术~

一种DWS迁移Oracle的CONNECT BY语法的方案的更多相关文章

  1. Windows C盘格式化或者同平台迁移oracle数据库

    我们知道如果是Linux 同平台迁移oracle数据库.只要是安全关闭了数据库,在新机器上创建用户组,配置了环境变量,将数据库安装目录拷贝到对应的目录就好用了. 一直在寻求Windows平台上这类的解 ...

  2. 12C 连接方式和 Oracle Easy Connect Naming method

    1.12C 连接方式 PDB is not an instance, so using SID in the connection string will not work. When the dat ...

  3. ORACLE中CONNECT BY...START WITH...的使用

    源: https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm http://www.cnblogs.com/baiy ...

  4. 迁移oracle数据库至新分区

    本文地址: http://www.cnblogs.com/blackmanba/p/move-oracle-database.html或者http://forkme.info/move-oracle- ...

  5. Oracle递归查询connect by

    一.概述 Oracle中可以通过START WITH . . . CONNECT BY . . .子句来实现SQL的层次查询. 自从Oracle 9i开始,可以通过 SYS_CONNECT_BY_PA ...

  6. oracle中 connect by prior 递归算法 -- 理解

    oracle中 connect by prior 递归算法 -- 理解 http://blog.163.com/xxciof/blog/static/7978132720095193113752/  ...

  7. 两种方法将oracle数据库中的一张表的数据导入到另外一个oracle数据库中

    oracle数据库实现一张表的数据导入到另外一个数据库的表中的方法有很多,在这介绍两个. 第一种,把oracle查询的数据导出为sql文件,执行sql文件里的insert语句,如下: 第一步,导出sq ...

  8. oracle使用connect by进行级联查询 树型菜单

    Oracle使用connect by进行级联查询 树型菜单(转) connect by可以用于级联查询,常用于对具有树状结构的记录查询某一节点的所有子孙节点或所有祖辈节点. 来看一个示例,现假设我们拥 ...

  9. MTK迁移Oracle单库

    MTK迁移Oracle单库 一. Mtk安装 1.1     安装jdk 要求jdk版本在1.7以上 安装完jdk后将需要的数据库jdbc驱动拷贝到$JAVA_HOME/jre/lib/ext  目录 ...

  10. mysql实现ORACLE的connect by prior父子递归查询

    oracle中有connect by prior ,可以实现父子递归查询.而mysql中没有这种功能,但我们可以变通实现. 比如一个表: Table Name: tb_Tree Id | Parent ...

随机推荐

  1. C# ref, in, out关键字

    写在前面:大内老A的这篇"老生常谈:值类型VS引用类型"放在微信收藏里好几个月了,终于趁着要讲JAVA传参机制的时候仔细地按照这篇博客,自己写代码跑一下,对C#的传参,ref,in ...

  2. 命令vue inspect > output.js报错:在此系统上禁止运行脚本

    用的这个命令去看output.js文件,结果报错. 解决方案是去对应目录下删掉vue.ps1就OK了 .

  3. Springboot+Mybatis+Mybatisplus 框架中增加自定义分页插件和sql 占位符修改插件

    一.Springboot简介 springboot 是当下最流行的web 框架,Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程 ...

  4. .Net中的内存泄露

    .Net中的内存泄露 说明: 虽然已经有GC垃圾回收器在工作,但是还是会出现内存泄露. 内存碎片 费托管内存泄露比托管内存泄露更加严重.GC可以移动托管内存,为其他对象腾空间.但是非托管内存将永远的卡 ...

  5. flask 三方模块

    flask 三方插件 Flask-AppBuilder - Simple and rapid Application builder, includes detailed security, auto ...

  6. WebSocket connection to 'ws://127.0.0.1:8089/websocket/0,1,10,admin' failed:

    WebSocket连接失败 背景: 相同项目数据库从mysql变更到sqlite,代码层面基本没有变更,但是WebSocket连接失败,查找多方原因,未找到问题,最后发现新项目JDK为OpenJDK, ...

  7. Python 潮流周刊#26:requests3 的现状

    你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.本周刊开源,欢迎投稿.另有电报频道作为副刊,补充发布更加丰富的资讯. 品牌赞助 本周刊由"Python猫 ...

  8. c#中命令模式详解

    基本介绍:   命令模式,顾名思义就是将命令抽象化,然后将请求者和接收者通过命令进行绑定.   而命令的请求者只管下达命令,命令的接收者只管执行命令.   从而实现了解耦,请求者和接受者二者相对独立. ...

  9. NET8 ORM 使用AOT SqlSugar

    AOT介绍 .Net8的本地预编机器码AOT,它几乎进行了100%的自举.微软为了摆脱C++的钳制,做了很多努力.也就是代码几乎是用C#重写,包括了虚拟机,GC,内存模型等等.而需要C++做的,也就仅 ...

  10. SpringBoot设置日志级别

    输出到控制台 logging: # 日志记录到文件中 file: # 指定文件名 name: server.log logback: rollingpolicy: # 指定文件大小 max-file- ...