摘要:本文提供一种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. Go函数介绍与一等公民

    Go函数介绍与一等公民 函数对应的英文单词是 Function,Function 这个单词原本是功能.职责的意思.编程语言使用 Function 这个单词,表示将一个大问题分解后而形成的.若干具有特定 ...

  2. Stable-diffusion WebUI API调用方法

    写这篇文章的主要原因是工作中需要写一个用训练好的模型批量生图的脚本,开始是想用python直接加载模型,但后来发现webui的界面中有不少好用的插件和参数,所以最终改成调用WebUI接口的方式来批量生 ...

  3. 实验四报告: 熟悉Python字典、集合、字符串的使用

    实验目标 本实验的主要目标是熟悉Python中字典.集合.字符串的创建和操作,包括字典的创建.访问.修改和合并,集合的创建.访问以及各种集合运算,以及字符串的创建.格式化和常用操作. 实验要求 通过编 ...

  4. 聊一聊 tcp/ip 在.NET故障分析的重要性

    一:背景 1. 讲故事 这段时间分析了几个和网络故障有关的.NET程序之后,真的越来越体会到计算机基础课的重要,比如 计算机网络 课,如果没有对 tcpip协议 的深刻理解,解决这些问题真的很难,因为 ...

  5. inget

    万能密码考点 payload ?id=1' or 1=1--+

  6. AcWing 178. 第K短路

    题意 给定一张 \(N\) 个点(编号 \(1,2-N\)),\(M\) 条边的有向图,求从起点 \(S\) 到终点 \(T\) 的第 \(K\) 短路的长度,路径允许重复经过点或边. 注意: 每条最 ...

  7. Python根据输入的公司编号、名称、网址,格式化输出公司信息。其中1)冒号统一为英文冒号,编号占6位,不足6位的前面补0。编号后面是制表符。

    根据输入的公司编号.名称.网址,格式化输出公司信息.其中 1)冒号统一为英文冒号,编号占6位,不足6位的前面补0.编号后面是制表符. 2)"公司名称:" 后面输出字符串占8位,左对 ...

  8. Datainside数据分析,基于大数据分析学生成绩综合评价

    Datainside是一种基于大数据分析的学生成绩综合评价方法,通过对海量学生成绩数据进行深度挖掘和分析,为学生的学习表现提供全面.客观的评价.以下是对Datainside数据分析学生成绩综合评价的详 ...

  9. 吉特日化MES & SQL Server 无法执行数据库脚本

    打开服务器打算远程执行一下脚本,突发发现数据库无法执行脚本,就想着是不是安装了 海康AGV 控制系统的问题导致,问题如下: 问题截图如下: 报错信息如下: ====================== ...

  10. [ABC282E] Choose Two and Eat One

    Problem Statement A box contains $N$ balls, each with an integer between $1$ and $M-1$ written on it ...