CN115080599A - 一种数据库查询sql字段血缘关系生成方法 - Google Patents

一种数据库查询sql字段血缘关系生成方法 Download PDF

Info

Publication number
CN115080599A
CN115080599A CN202210878726.XA CN202210878726A CN115080599A CN 115080599 A CN115080599 A CN 115080599A CN 202210878726 A CN202210878726 A CN 202210878726A CN 115080599 A CN115080599 A CN 115080599A
Authority
CN
China
Prior art keywords
expression
name
field
query
alias
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202210878726.XA
Other languages
English (en)
Other versions
CN115080599B (zh
Inventor
苏鑫
李明
张乙
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Chengdu Fengshun Technology Co ltd
Original Assignee
Chengdu Fengshun Technology Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Chengdu Fengshun Technology Co ltd filed Critical Chengdu Fengshun Technology Co ltd
Priority to CN202210878726.XA priority Critical patent/CN115080599B/zh
Publication of CN115080599A publication Critical patent/CN115080599A/zh
Application granted granted Critical
Publication of CN115080599B publication Critical patent/CN115080599B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/242Query formulation
    • G06F16/2433Query languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/28Databases characterised by their database models, e.g. relational or object models
    • G06F16/284Relational databases

Landscapes

  • Engineering & Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Mathematical Physics (AREA)
  • Computational Linguistics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开一种数据库查询SQL字段血缘关系生成方法,先构建SQL血缘解析器,输入查询SQL语句;解析SQL语句获取结果的字段表达式集合和查询表表达式集合;进行单个字段表达式处理;再进行单个表表达式处理:获取查询表表达式集合中的第一个查询表的表达式;判断第一个查询表之后是否存在连接查询,遍历第一个查询表之后的所有连接的查询表的表达式,获取表的别名与来源表名的映射关系;再计算字段血缘关系,返回字段血缘结构;不仅能够获取需要数据的来源表,还能够构建结果字段来源于哪些表的哪些字段。

Description

一种数据库查询SQL字段血缘关系生成方法
技术领域
本发明属于数据库查询技术领域,特别是涉及一种数据库查询SQL字段血缘关系生成方法。
背景技术
数据治理里经常提到的一个词就是血缘分析,血缘分析是保证数据融合的一个手段,通过血缘分析实现数据融合处理的可追溯。大数据数据血缘是指数据产生的链路。
数据血缘,是从产生、ETL处理、加工、融合、流转,到最终消亡,数据之间自然会形成一种关系。好比人类社会中的人际关系,类似的一种关系来表达数据之间的这种关系,称之为数据的血缘关系。从技术角度来讲,数据a通过ETL处理生成了数据b,那么,我们会说,数据a与数据b具有血缘关系。不过与人类的血缘关系略有不同,数据血缘关系还具有一些个性化的特征。数据血缘具有归属性、多源性、可追溯性和层次性。归属性:特定的数据归属特定的组织(或个人)。多源性:同一个数据可以有多个来源, 一个数据可以是多个数据经过加工而生成的,而且这种加工过程可以是多个。可追溯性: 数据的血缘关系,体现了数据的生命周期,体现了数据从产生到消亡的整个过程,具备可追溯性。层次性: 数据的血缘关系是有层次的;对数据的分类、归纳、总结等对数据进行的描述信息又形成了新的数据,不同程度的描述信息形成了数据的层次。
对于数据血缘关系的获取方式,目前采用的技术有:人工维护,现场专人维护数据来源SQL中结果字段来源于哪些表的哪些字段;但是这种,对人员专业技术要求较高,大量ETL作业维护时人力、时间成本高。脚本解析QLExpress,主要面向脚本解析,而非专业SQL解析,解析SQL需要开发人员自行实现规则。JDBC协议,可以获取结果字段,但不能获取结果字段来源与哪些表的哪些字段,且不同JDBC驱动对JDBC协议支持程度不同。SQL解析引擎JSQLParser,Java专业SQL解析工具,但只能获取到查询语句的结果字段集合和来源表集合;不能构建结果字段来源于哪些表的哪些字段。
发明内容
为了解决上述问题,本发明提出了一种数据库查询SQL字段血缘关系生成方法,不仅能够获取需要数据的来源表,还能够构建结果字段来源于哪些表的哪些字段。
为达到上述目的,本发明采用的技术方案是:一种数据库查询SQL字段血缘关系生成方法,包括步骤:
S10,构建SQL血缘解析器,输入查询SQL语句;
S20,解析SQL语句获取结果的字段表达式集合和查询表表达式集合;
S30,进行单个字段表达式处理:遍历处理结果的字段表式集合,获取结果字段名与来源字段名的映射关系;将映射关系缓存到键值对结构M1中;键值对结构M1中:key为结果字段名,value为来源字段名;
S40,进行单个表表达式处理:获取查询表表达式集合中的第一个查询表的表达式,获取第一个查询表的别名与来源表名的映射关系;将映射关系缓存到键值对结构M2中;键值对结构M2中:key为表别名,value为来源表名;
S50,判断第一个查询表之后是否存在连接查询,若存在进入步骤S60,若不存在进入步骤S70;
S60,遍历第一个查询表之后的所有连接的查询表的表达式,获取表的别名与来源表名的映射关系;将映射关系缓存到键值对结构M2中;键值对结构M2中:key为表别名,value为来源表名;
S70,计算字段血缘关系,遍历M1中value来源字段名,若value来源字段名来中存在表别名,则将value来源字段名中的表别名通过M2得出来源表名,并用来源表名替换M1中value中的表别名;若value来源字段名中不存在则表别名,则在其中增加来源表名;返回字段血缘结构。
进一步的是,在步骤S30中,进行单个字段表达式处理,包括步骤:
S31,输入单个字段表达式;
S32,判断字段表达式中是否有字段别名;如果有别名获取字段别名为结果字段名;如果没有别名获取来源字段名为结果字段名;
S33,获取除别名之外的部分作为一个新的表达式;
S34,判断新字段表达式中是否为使用双括号的插入语;
如果存在插入语则取消表达式中最外层双括号;循环判断处理后的表达式是否为插入语,直到不是插入语表达式为止;
S35,判断表达式是否为函数;
如果为函数表达式,则进行函数表达式处理;表达式为非函数表达式,判断表达式是否为值;
S36,判断表达式是否为值;
如果为值表达式,则处理结束,表示所输入的字段表达式没有血缘,是新产生的常量;如果为非值表达式,则表达式转字符串,字符串表示来源字段名;
S37,结果字段名与来源字段名的映射关系写入M1,该字段处理结束。
进一步的是,所述函数表达式处理,包括步骤:
S351,输入函数表达式,判断输入是否为函数表达式,如果不是函数表达式则执行步骤S36;如果是函数表达式则判断函数类别;
判断函数类别包括:
S352,如果函数表达式为case表达式,是则,获取case表达式中的switch表达式;否则,进入步骤S353;
判断switch表达式是否为空;不为空则将switch表达式作为输入返回步骤S351进行递归处理到不是函数表达式为止;switch表达式为空,则获取else表达式,将else表达式作为输入步骤S351进行递归处理到不是函数表达式为止;以及,switch表达式为空,则获取所有when表达式集合,遍历集合将每个when表达式作为输入步骤S351进行递归处理到不是函数表达式为止;
S353,如果函数表达式为function表达式,是则,获取function表达式中函数参数表达式集合,遍历集合将每个参数表达式作为输入步骤S351进行递归处理到不是函数表达式为止;否则,进入步骤S354;
S354,如果函数表达式为cast表达式,是则,获取cast左边的表达式,将其作为输入步骤S351进行递归处理到不是函数表达式为止;否则,进入步骤S355;
S355,如果函数表达式为binary表达式,是则,先分解获取binary表达式的左边的表达式和右边的表达式;对两个表达式去除插入语;然后将两个表达式分别作为输入步骤S351进行递归处理到不是函数表达式为止;否则,进入步骤S356;
S356,如果函数表达式为in表达式,是则,先分解获取in表达式的左边的表达式,然后将左边表达式作为输入步骤S351进行递归处理到不是函数表达式为止;否则,结束。
进一步的是,在步骤S40中,进行单个表表达式处理,包括步骤:
S41,输入单个查询表的表达式;
S42,判断表达式是否为子查询,如果不是子查询则进行非子查询处理,如果是子查询执行子查询处理。
进一步的是,所述非子查询处理包括步骤:
S4211,获取表达式中表名、数据库名和表空间名;
S4212,判断数据库名和表空间名都不为空,是则使用表名、数据库名和表空间名生成来源表名;
S4213,判断数据库名为空,表空间名不为空,是则使用表名和表空间名生成来源表名;
S4214,步骤S4212和4213两个条件都不满足的,则只使用表名作为来源表名;
S4215,判断表是否有别名,没有别名则为单表查询,使用变量T记录表名,T为SQL血缘解析器中的属性;有别名则获取别名,将表别名与来源表名的映射关系的映射关系写入M2。
进一步的是,所述子查询处理包括步骤:
S4221,先获取子查询别名;
S4222,获取子查询SQL语句;
S4223,使用子查询语句SQL构造SQL血缘解析器,将映射关系缓存到键值对结构M3中,key为子查询别名,value为子查询SQL解析器;
S4224,使用子查询SQL血缘解析器,利用子查询SQL血缘解析器再次执行步骤S20-S40解析SQL语句获取结果的字段表达式集合和查询表表达式集合,进行单个字段表达式处理和进行单个表表达式处理;以及步骤S4211-S4215非子查询处理或步骤S4221-S4224子查询处理过程。
进一步的是,在步骤S70中,计算字段血缘关系,包括步骤:
S701,创建变量MR,用于存放最终血缘结果;MR为键值对结构,key为结果字段名,value为来源字段名集合;
S702,获取M1的key集合进行遍历,对于单一key变量K执行步骤S703-S712;
S703,获取K对应的value集合VS,并创建集合VS2,VS2集合用于存放最终来源字段;MR的key为K,value为VS2;
S704,遍历VS集合,对单一value变量V执行步骤S705-S710;
S705,判断V中是否存在表别名;如果不存在表别名,表示为单表查询,最终V2=T+"."+V;
S706,V中存在表别名,先拆分V取出表别名TA和字段名F;
S707,然后通过M3获取该表别名是否有对应的子查询SQL血缘解析器;
S708,表别名不存在子查询SQL血缘解析器,则不是子查询,直接从当前SQL血缘解析器中的M2中获取表别名对应的来源表名;以表别名TA作为key从M2中获取对应value变量TT作为来源表名,V2=TT+"."+F;
S709,将V2添加到VS2集合;
S710,表别名存在子查询SQL血缘解析器,则使用步骤S706获取的子查询SQL血缘解析器中M2获取字段F对应的来源表和来源字段;F作为key,递归执行步骤S703-S708,直到没有下层子查询为止,没有下层子查询时向上层SQL血缘解析器返回下层SQL血缘解析器计算的VS2集合;上层接收到下层的VS2集合后将下层的VS2集合和上层的VS2集合合并;
S711,遍历完value集合后,将K和VS2集合写入MR;
S712,遍历完key集合后,返回MR。
采用本技术方案的有益效果:
本发明先构建SQL血缘解析器,输入查询SQL语句;解析SQL语句获取结果的字段表达式集合和查询表表达式集合;进行单个字段表达式处理;再进行单个表表达式处理:获取查询表表达式集合中的第一个查询表的表达式;判断第一个查询表之后是否存在连接查询,遍历第一个查询表之后的所有连接的查询表的表达式,获取表的别名与来源表名的映射关系;再计算字段血缘关系,返回字段血缘结构;不仅能够获取需要数据的来源表,还能够构建结果字段来源于哪些表的哪些字段。
本发明支持函数处理;支持一个结果字段来源于多个表空间的多个表的多个字段;分析过程脱离具体DBMS数据库管理系统,只根据语法解析;支持mysql、oracle、pgsql、mssql、hive等的查询sql和函数。
附图说明
图1 为本发明的一种数据库查询SQL字段血缘关系生成方法流程示意图;
图2 为本发明实施例中单个字段表达式处理过程的流程图;
图3 为本发明实施例中函数表达式处理过程的流程图;
图4 为本发明实施例中单个表的表达式处理过程的流程图;
图5 为本发明实施例中计算字段血缘关系的流程图。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面结合附图对本发明作进一步阐述。
在本实施例中,参见图1所示,本发明提出了一种数据库查询SQL字段血缘关系生成方法,包括步骤:
S10,构建SQL血缘解析器,输入查询SQL语句;
S20,解析SQL语句获取结果的字段表达式集合和查询表表达式集合;
S30,进行单个字段表达式处理:遍历处理结果的字段表式集合,获取结果字段名与来源字段名的映射关系;将映射关系缓存到键值对结构M1中;键值对结构M1中:key为结果字段名,value为来源字段名;
S40,进行单个表表达式处理:获取查询表表达式集合中的第一个查询表的表达式,获取第一个查询表的别名与来源表名的映射关系;将映射关系缓存到键值对结构M2中;键值对结构M2中:key为表别名,value为来源表名;
S50,判断第一个查询表之后是否存在连接查询,若存在进入步骤S60,若不存在进入步骤S70;
S60,遍历第一个查询表之后的所有连接的查询表的表达式,获取表的别名与来源表名的映射关系;将映射关系缓存到键值对结构M2中;键值对结构M2中:key为表别名,value为来源表名;
S70,计算字段血缘关系,遍历M1中value来源字段名,若value来源字段名来中存在表别名,则将value来源字段名中的表别名通过M2得出来源表名,并用来源表名替换M1中value中的表别名;若value来源字段名中不存在则表别名,则在其中增加来源表名;返回字段血缘结构。
作为上述实施例的优化方案,如图2所示,在步骤S30中,进行单个字段表达式处理,包括步骤:
S31,输入单个字段表达式;
S32,判断字段表达式中是否有字段别名;如果有别名获取字段别名为结果字段名;比如表达式为a.num num1,则结果字段名为num1;如果没有别名获取来源字段名为结果字段名;比如表达式为a.num,则结果字段名为num;
S33,获取除别名之外的部分作为一个新的表达式;
比如表达式为a.num,则新的表达式为a.num;
比如表达式为a.num num1,则新的表达式为a.num;
比如表达式为count(a.num) count,则新的表达式为count(a.num);
比如表达式为(a.num1+b.num2) num,则新的表达式为(a.num1+b.num2);
S34,判断新字段表达式中是否为使用双括号的插入语;
插入语表达式举例:(case u.sex when 1 then '男' when 2 then '女' else '空的' end)或者(a.num1+b.num2)
例如:count(a.num)表达式不是插入语,而是函数。
如果存在插入语则取消表达式中最外层双括号,比如表达式(a.num1+b.num2)处理后新的表达式为a.num1+b.num2;循环判断处理后的表达式是否为插入语,直到不是插入语表达式为止;比如((a.num1+b.num2))处理后新的表达式为a.num1+b.num2。
S35,判断表达式是否为函数;
函数表达式类型function表达式、cast表达式、case表达式、binary表达式。只要是其中一种则认为是函数表达式。
举例:
function表达式:
count(a.num)中count为sql聚合函数;
NVL(MAX(b.num),100)中NVL为RDBMS的函数,MAX为sql聚合函数。
cast表达式:
CAST('9.5' AS decimal(10,2))为将字符串'9.5'转为类型decimal(10,2)。
case表达式:
case u.sex when 1 then '男' when 2 then '女' else '空的' end;
或者
CASE WHEN sex = 2 THEN 1 ELSE NULL END。
binary表达式:
a.num1+b.num2;
或者(a.num1+b.num2)/(a.max-a.avg);
in表达式:
type in(0,1);
或者substr(a.tel,1,4) in ('1704','1707','1708','1709')。
如果为函数表达式,则进行函数表达式处理;表达式为非函数表达式,判断表达式是否为值。
S36,判断表达式是否为值;
值类型包含String、Double、Long、Null、Hex、Date、Timestamp。只要是其中一种则认为是值表达式。
举例:
String:'9.5'或者'sfsdgdsg',使用单引号表示的;
Double:9.5或者-9.5,带小数;
Long:9或者-9,整数;
Null:null或者NULL,表示空;
Hex:表示十六进制数。不同数据库处理方式不同;
Date:表示日期。不同数据库处理方式不同;
Timestamp:表示时间戳。不同数据库处理方式不同。
如果为值表达式,则该字段处理结束,表示该字段没有血缘,是新产生的常量;如果为非值表达式,则表达式转字符串,字符串表示来源字段名;
为值表达式举例:
比如sql:select 1 num;或者select id,1 num from a;
中的num没有血缘,值来自常量1;
非值表达式举例:
id,单表情况下表没有别名;
或a.id,表有别名,a为表别名。
S37,结果字段名与来源字段名的映射关系写入M1,该字段处理结束。
其中,如图3所示,所述函数表达式处理,包括步骤:
S351,输入函数表达式,判断输入是否为函数表达式,如果不是函数表达式则执行步骤S36;如果是函数表达式则判断函数类别;
判断函数类别包括:
S352,如果函数表达式为case表达式,是则,获取case表达式中的switch表达式;
举例:
case u.sex when 1 then '男' when 2 then '女' else '空的' end返回u.sex;
CASE WHEN sex = 2 THEN 1 ELSE NULL END返回空。
判断switch表达式是否为空;不为空则将switch表达式作为输入返回步骤S351进行递归处理到不是函数表达式为止;switch表达式为空,则获取else表达式,将else表达式作为输入步骤S351进行递归处理到不是函数表达式为止;switch表达式为空,则获取所有when表达式集合,遍历集合将每个when表达式作为输入步骤S351进行递归处理到不是函数表达式为止;
S353,如果函数表达式为function表达式,获取function表达式中函数参数表达式集合,遍历集合将每个参数表达式作为输入步骤S351进行递归处理到不是函数表达式为止;
举例:
IFNULL(MAX(b.num),100),参数集合为[MAX(b.num),100];
而MAX(b.num)作为函数将再次递归获取参数集合[b.num],b.num最后将作为来源字段名存入M1。
而100作为值,返回步骤S351进行递归处理到不是函数表达式为止。
S354,如果函数表达式为cast表达式,获取cast左边的表达式,将其作为输入步骤S351进行递归处理到不是函数表达式为止;
举例:
CAST(a.no AS decimal)获取结果为a.no;
CAST('9.5' AS decimal(10,2))获取结果为'9.5'字符串值。
S355,如果函数表达式为binary表达式,先分解获取binary表达式的左边的表达式和右边的表达式;对两个表达式去除插入语;然后将两个表达式分别作为输入步骤S351进行递归处理到不是函数表达式为止;
举例:
a.num1+b.num2分解后为a.num1和b.num2;
a.num1+b.num2+c.num3分解后为a.num1+b.num2和c.num3;
(a.num1+b.num2)/(a.max-a.avg)分解后为(a.num1+b.num2)和(a.max-a.avg),然后去除插入语得到a.num1+b.num2和a.max-a.avg,再执行递归步骤。
S356,如果函数表达式为in表达式,先分解获取in表达式的左边的表达式,然后将左边表达式作为输入步骤S351进行递归处理到不是函数表达式为止。
作为上述实施例的优化方案,如图4所示,在步骤S40中,进行单个表表达式处理,包括步骤:
S41,输入单个查询表的表达式;
S42,判断表达式是否为子查询,如果不是子查询则进行非子查询处理,如果是子查询执行子查询处理。
其中,所述非子查询处理包括步骤:
S4211,获取表达式中表名、数据库名和表空间名;
举例:
select id,name from db.s.t,db为数据库名,s为表空间名,t为表名。
select id,name from s.t,s为表空间名,t为表名。
S4212,判断数据库名和表空间名都不为空,是则使用表名、数据库名和表空间名生成来源表名;
举例:databaseName + "." + schemaName + "." + tableName。
S4213,判断数据库名为空,表空间名不为空,是则使用表名和表空间名生成来源表名;
举例:schemaName + "." + tableName。
S4214,步骤S4212和4213两个条件都不满足的,则只使用表名作为来源表名;
S4215,判断表是否有别名,没有别名则为单表查询,使用变量T记录表名,T为SQL血缘解析器中的属性;有别名则获取别名,将表别名与来源表名的映射关系的映射关系写入M2。
其中,所述子查询处理包括步骤:
S4221,先获取子查询别名;
S4222,获取子查询SQL语句;
S4223,使用子查询语句SQL构造SQL血缘解析器,将映射关系缓存到键值对结构M3中,key为子查询别名,value为子查询SQL解析器;
S4224,使用子查询SQL血缘解析器,利用子查询SQL血缘解析器再次执行步骤S20-S40解析SQL语句获取结果的字段表达式集合和查询表表达式集合,进行单个字段表达式处理和进行单个表表达式处理;以及步骤S4211-S4215非子查询处理或步骤S4221-S4224子查询处理过程。
作为上述实施例的优化方案,如图5所示,在步骤S70中,计算字段血缘关系,包括步骤:
S701,创建变量MR,用于存放最终血缘结果;MR为键值对结构,key为结果字段名,value为来源字段名集合;
MR与M1不同的是value中的表别名替换为来源表名,或者增加了来源表名。
比如:
SQL为select id,name from db.s.t,M1为{name=[name], id=[id]},MR最终为{name=[db.s.t.name], id=[db.s.t.id]}。
SQL为select a1.id,a1.name from a a1,M1为{name=[a1.name], id=[a1.id]}。MR最终为{name=[a.name], id=[a.id]}。
S702,获取M1的key集合进行遍历,对于单一key变量K执行步骤S703-S712;
S703,获取K对应的value集合VS,并创建集合VS2,VS2集合用于存放最终来源字段;MR的key为K,value为VS2;
举例:SQL为select id,name from db.s.t,K为name,VS集合为[name],VS2集合最终为[db.s.t.name]。
S704,遍历VS集合,对单一value变量V执行步骤S705-S710;
S705,判断V中是否存在表别名;如果不存在表别名,表示为单表查询,最终V2=T+"."+V;
S706,V中存在表别名,先拆分V取出表别名TA和字段名F;
举例:a1.id拆分获得表别名a1和字段名id。
S707,然后通过M3获取该表别名是否有对应的子查询SQL血缘解析器;
S708,表别名不存在子查询SQL血缘解析器,则不是子查询,直接从当前SQL血缘解析器中的M2中获取表别名对应的来源表名;以表别名TA作为key从M2中获取对应value变量TT作为来源表名,V2=TT+"."+F;
S709,将V2添加到VS2集合;
S710,表别名存在子查询SQL血缘解析器,则使用步骤S706获取的子查询SQL血缘解析器中M2获取字段F对应的来源表和来源字段;F作为key,递归执行步骤S703-S708,直到没有下层子查询为止,没有下层子查询时向上层SQL血缘解析器返回下层SQL血缘解析器计算的VS2集合;上层接收到下层的VS2集合后将下层的VS2集合和上层的VS2集合合并;
举例:
SQL为select c.id,c.name,NVL(MAX(c.num),100) max from (select a.id,b.name,b.num from user1 a inner join user2 b on a.id=b.no) c。
上层K为name,F为name,VS为[c.name],V为c.name,VS2为[];
下层子查询K为name,F为name,VS为[b.name],V为b.name;
下层执行步骤40-46,且没有再下层的子查询,得到VS2为[user2.name];
上层合并[]与[user2.name]得到[user2.name]。
S711,遍历完value集合后,将K和VS2集合写入MR;
S712,遍历完key集合后,返回MR。
其中,“.”为SQL语法中符号,作用为表示数据库下表空间或表空间下表或表中字段。
举例:databaseName + "." + schemaName + "." + tableName表示某个数据库下某个表空间下某个具体的表。
具体测试结果 :
1、单表测试:
(1)输入(表无别名,字段无别名)select id,name from a;
输出{name=[a.name], id=[a.id]}。
(2)输入(表无别名,字段有别名)select id id1,name as name1 from a;
输出{id1=[a.id], name1=[a.name]}。
(3)输入(表有别名,字段无别名)select a1.id,a1.name from a a1;
输出{name=[a.name], id=[a.id]}。
2、连接查询:
(1)输入select u.name userName,u.id,d.name depName,d.id depId fromuser u left join department d on u.depId = d.id where u.id = 1;
输出{depId=[department.id], id=[user.id], userName=[user.name],depName=[department.name]}。
(2)输入(子查询)select b.id,c1.name,IFNULL(MAX(b.num),100) max from(select id,num from a) b,c c1 where b.id=c1.no;
输出{max=[a.num], name=[c.name], id=[a.id]}。
(3)输入(子查询中包含连接查询)select c.id,c.name,NVL(MAX(c.num),100)max from (select a.id,b.name,b.num from user1 a inner join user2 b on a.id=b.no) c;
输出{max=[user2.num], name=[user2.name], id=[user1.id]}。
3、函数:
(1)输入(简单计算)select a.id,a.num1+b.num2 num from user1 a innerjoin user2 b on a.id=b.id;
输出{num=[user1.num1, user2.num2], id=[user1.id]}。
(2)输入(复合计算)select a.id,(a.num1+b.num2)/a.avg num from user1 ainner join user2 b on a.id=b.id;
输出{num=[user1.num1, user2.num2, user1.avg], id=[user1.id]}。
(3)输入(聚合函数)select a1.id,a1.name,count(a1.type) count1 from a a1group by type;
输出{count1=[a.type], name=[a.name], id=[a.id]}。
(4)输入(系统函数和聚合函数)select b.id,b.name,NVL(MAX(b.num),100) maxfrom (select * from a) b;
输出{max=[a.num], name=[a.name], id=[a.id]}
4、函数表达式case、when、then:
(1)输入select u.id,u.name,(case u.sex when 1 then '男' when 2 then '女' else '空的' end) sex from users u;
输出{sex=[users.sex], name=[users.name], id=[users.id]}。
(2)输入SELECT grade, COUNT (CASE WHEN sex = 1 THEN 1 ELSE NULL END)男生数,COUNT (CASE WHEN sex = 2 THEN 1 ELSE NULL END) 女生数 FROM studentsGROUP BY grade;
输出{grade=[students.grade], 女生数=[students.sex], 男生数=[students.sex]}。
5、表名带数据库名,表空间名:
(1)输入select a1.id,a1.name from db.a a1;
输出{name=[db.a.name], id=[db.a.id]}。
(2)输入select id,name from db.s.t;
输出{name=[db.s.t.name], id=[db.s.t.id]}。
以上显示和描述了本发明的基本原理和主要特征和本发明的优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护范围由所附的权利要求书及其等效物界定。

Claims (7)

1.一种数据库查询SQL字段血缘关系生成方法,其特征在于,包括步骤:
S10,构建SQL血缘解析器,输入查询SQL语句;
S20,解析SQL语句获取结果的字段表达式集合和查询表表达式集合;
S30,进行单个字段表达式处理:遍历处理结果的字段表式集合,获取结果字段名与来源字段名的映射关系;将映射关系缓存到键值对结构M1中;键值对结构M1中:key为结果字段名,value为来源字段名;
S40,进行单个表表达式处理:获取查询表表达式集合中的第一个查询表的表达式,获取第一个查询表的别名与来源表名的映射关系;将映射关系缓存到键值对结构M2中;键值对结构M2中:key为表别名,value为来源表名;
S50,判断第一个查询表之后是否存在连接查询,若存在进入步骤S60,若不存在进入步骤S70;
S60,遍历第一个查询表之后的所有连接的查询表的表达式,获取表的别名与来源表名的映射关系;将映射关系缓存到键值对结构M2中;键值对结构M2中:key为表别名,value为来源表名;
S70,计算字段血缘关系,若M1的value来源字段名中存在则表别名,则遍历M1中value来源字段名,若value来源字段名来中存在表别名,则将valuevalue中来源字段名中的表别名通过M2得出来源表名,并用来源表名替换M1中value中的表别名;若M1的value来源字段名中不存在则表别名,则在其中增加来源表名;返回字段血缘结构。
2.根据权利要求1所述的一种数据库查询SQL字段血缘关系生成方法,其特征在于,在步骤S30中,进行单个字段表达式处理,包括步骤:
S31,输入单个字段表达式;
S32,判断字段表达式中是否有字段别名;如果有别名获取字段别名为结果字段名;如果没有别名获取来源字段名为结果字段名;
S33,获取除别名之外的部分作为一个新的表达式;
S34,判断新字段表达式中是否为使用双括号的插入语;
如果存在插入语则取消表达式中最外层双括号;循环判断处理后的表达式是否为插入语,直到不是插入语表达式为止;
S35,判断表达式是否为函数;
如果为函数表达式,则进行函数表达式处理;表达式为非函数表达式,判断表达式是否为值;
S36,判断表达式是否为值;
如果为值表达式,则处理结束,表示所输入的字段表达式没有血缘,是新产生的常量;如果为非值表达式,则表达式转字符串,字符串表示来源字段名;
S37,结果字段名与来源字段名的映射关系写入M1,该字段处理结束。
3.根据权利要求2所述的一种数据库查询SQL字段血缘关系生成方法,其特征在于,所述函数表达式处理,包括步骤:
S351,输入函数表达式,判断输入是否为函数表达式,如果不是函数表达式则执行步骤S36;如果是函数表达式则判断函数类别;
判断函数类别包括:
S352,如果函数表达式为case表达式,是则,获取case表达式中的switch表达式;否则,进入步骤S353;
判断switch表达式是否为空;不为空则将switch表达式作为输入返回步骤S351进行递归处理到不是函数表达式为止;switch表达式为空,则获取else表达式,将else表达式作为输入步骤S351进行递归处理到不是函数表达式为止;以及,switch表达式为空,则获取所有when表达式集合,遍历集合将每个when表达式作为输入步骤S351进行递归处理到不是函数表达式为止;
S353,如果函数表达式为function表达式,是则,获取function表达式中函数参数表达式集合,遍历集合将每个参数表达式作为输入步骤S351进行递归处理到不是函数表达式为止;否则,进入步骤S354;
S354,如果函数表达式为cast表达式,是则,获取cast左边的表达式,将其作为输入步骤S351进行递归处理到不是函数表达式为止;否则,进入步骤S355;
S355,如果函数表达式为binary表达式,是则,先分解获取binary表达式的左边的表达式和右边的表达式;对两个表达式去除插入语;然后将两个表达式分别作为输入步骤S351进行递归处理到不是函数表达式为止;否则,进入步骤S356;
S356,如果函数表达式为in表达式,是则,先分解获取in表达式的左边的表达式,然后将左边表达式作为输入步骤S351进行递归处理到不是函数表达式为止;否则,结束。
4.根据权利要求1所述的一种数据库查询SQL字段血缘关系生成方法,其特征在于,在步骤S40中,进行单个表表达式处理,包括步骤:
S41,输入单个查询表的表达式;
S42,判断表达式是否为子查询,如果不是子查询则进行非子查询处理,如果是子查询执行子查询处理。
5.根据权利要求4所述的一种数据库查询SQL字段血缘关系生成方法,其特征在于,所述非子查询处理包括步骤:
S4211,获取表达式中表名、数据库名和表空间名;
S4212,判断数据库名和表空间名都不为空,是则使用表名、数据库名和表空间名生成来源表名;
S4213,判断数据库名为空,表空间名不为空,是则使用表名和表空间名生成来源表名;
S4214,步骤S4212和4213两个条件都不满足的,则只使用表名作为来源表名;
S4215,判断表是否有别名,没有别名则为单表查询,使用变量T记录表名,T为SQL血缘解析器中的属性;有别名则获取别名,将表别名与来源表名的映射关系的映射关系写入M2。
6.根据权利要求4所述的一种数据库查询SQL字段血缘关系生成方法,其特征在于,所述子查询处理包括步骤:
S4221,先获取子查询别名;
S4222,获取子查询SQL语句;
S4223,使用子查询语句SQL构造SQL血缘解析器,将映射关系缓存到键值对结构M3中,key为子查询别名,value为子查询SQL解析器;
S4224,使用子查询SQL血缘解析器,利用子查询SQL血缘解析器再次执行步骤S20-S40解析SQL语句获取结果的字段表达式集合和查询表表达式集合,进行单个字段表达式处理和进行单个表表达式处理;以及步骤S4211-S4215非子查询处理或步骤S4221-S4224子查询处理过程。
7.根据权利要求6所述的一种数据库查询SQL字段血缘关系生成方法,其特征在于,在步骤S70中,计算字段血缘关系,包括步骤:
S701,创建变量MR,用于存放最终血缘结果;MR为键值对结构,key为结果字段名,value为来源字段名集合;
S702,获取M1的key集合进行遍历,对于单一key变量K执行步骤S703-S712;
S703,获取K对应的value集合VS,并创建集合VS2,VS2集合用于存放最终来源字段;MR的key为K,value为VS2;
S704,遍历VS集合,对单一value变量V执行步骤S705-S710;
S705,判断V中是否存在表别名;如果不存在表别名,表示为单表查询,最终V2=T+"."+V;
S706,V中存在表别名,先拆分V取出表别名TA和字段名F;
S707,然后通过M3获取该表别名是否有对应的子查询SQL血缘解析器;
S708,表别名不存在子查询SQL血缘解析器,则不是子查询,直接从当前SQL血缘解析器中的M2中获取表别名对应的来源表名;以表别名TA作为key从M2中获取对应value变量TT作为来源表名,V2=TT+"."+F;
S709,将V2添加到VS2集合;
S710,表别名存在子查询SQL血缘解析器,则使用步骤S706获取的子查询SQL血缘解析器中M2获取字段F对应的来源表和来源字段;F作为key,递归执行步骤S703-S708,直到没有下层子查询为止,没有下层子查询时向上层SQL血缘解析器返回下层SQL血缘解析器计算的VS2集合;上层接收到下层的VS2集合后将下层的VS2集合和上层的VS2集合合并;
S711,遍历完value集合后,将K和VS2集合写入MR;
S712,遍历完key集合后,返回MR。
CN202210878726.XA 2022-07-25 2022-07-25 一种数据库查询sql字段血缘关系生成方法 Active CN115080599B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210878726.XA CN115080599B (zh) 2022-07-25 2022-07-25 一种数据库查询sql字段血缘关系生成方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210878726.XA CN115080599B (zh) 2022-07-25 2022-07-25 一种数据库查询sql字段血缘关系生成方法

Publications (2)

Publication Number Publication Date
CN115080599A true CN115080599A (zh) 2022-09-20
CN115080599B CN115080599B (zh) 2022-11-25

Family

ID=83243842

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210878726.XA Active CN115080599B (zh) 2022-07-25 2022-07-25 一种数据库查询sql字段血缘关系生成方法

Country Status (1)

Country Link
CN (1) CN115080599B (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116502273A (zh) * 2023-06-25 2023-07-28 中科金瑞(北京)大数据科技有限公司 基于数据血缘的动态数据脱敏方法、装置和设备
CN117370620A (zh) * 2023-12-08 2024-01-09 广东航宇卫星科技有限公司 一种数据血缘的构建方法、装置、终端设备及存储介质

Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110633333A (zh) * 2019-09-25 2019-12-31 京东数字科技控股有限公司 数据血缘关系的处理方法及系统、计算设备和介质
CN110866029A (zh) * 2019-10-11 2020-03-06 支付宝(杭州)信息技术有限公司 sql语句构建方法、装置、服务器及可读存储介质
CN110908997A (zh) * 2019-10-09 2020-03-24 支付宝(杭州)信息技术有限公司 数据血缘构建方法、装置、服务器及可读存储介质
CN111078729A (zh) * 2019-12-19 2020-04-28 医渡云(北京)技术有限公司 医疗数据溯源方法、装置、系统、存储介质以及电子设备
CN112256721A (zh) * 2020-10-21 2021-01-22 平安科技(深圳)有限公司 Sql语句解析方法、系统、计算机设备和存储介质
CN113127478A (zh) * 2019-12-31 2021-07-16 奇安信科技集团股份有限公司 数据内生血缘关系的分析方法、装置和计算机设备
CN114003231A (zh) * 2021-09-28 2022-02-01 厦门国际银行股份有限公司 一种sql语法解析树优化方法及系统
CN114265945A (zh) * 2021-12-30 2022-04-01 多点生活(武汉)科技有限公司 血缘关系提取方法、装置及电子设备
CN114328471A (zh) * 2022-03-14 2022-04-12 杭州半云科技有限公司 一种基于数据虚拟化引擎的数据模型及其构建方法

Patent Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110633333A (zh) * 2019-09-25 2019-12-31 京东数字科技控股有限公司 数据血缘关系的处理方法及系统、计算设备和介质
CN110908997A (zh) * 2019-10-09 2020-03-24 支付宝(杭州)信息技术有限公司 数据血缘构建方法、装置、服务器及可读存储介质
CN110866029A (zh) * 2019-10-11 2020-03-06 支付宝(杭州)信息技术有限公司 sql语句构建方法、装置、服务器及可读存储介质
CN111078729A (zh) * 2019-12-19 2020-04-28 医渡云(北京)技术有限公司 医疗数据溯源方法、装置、系统、存储介质以及电子设备
CN113127478A (zh) * 2019-12-31 2021-07-16 奇安信科技集团股份有限公司 数据内生血缘关系的分析方法、装置和计算机设备
CN112256721A (zh) * 2020-10-21 2021-01-22 平安科技(深圳)有限公司 Sql语句解析方法、系统、计算机设备和存储介质
CN114003231A (zh) * 2021-09-28 2022-02-01 厦门国际银行股份有限公司 一种sql语法解析树优化方法及系统
CN114265945A (zh) * 2021-12-30 2022-04-01 多点生活(武汉)科技有限公司 血缘关系提取方法、装置及电子设备
CN114328471A (zh) * 2022-03-14 2022-04-12 杭州半云科技有限公司 一种基于数据虚拟化引擎的数据模型及其构建方法

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116502273A (zh) * 2023-06-25 2023-07-28 中科金瑞(北京)大数据科技有限公司 基于数据血缘的动态数据脱敏方法、装置和设备
CN116502273B (zh) * 2023-06-25 2023-09-05 中科金瑞(北京)大数据科技有限公司 基于数据血缘的动态数据脱敏方法、装置和设备
CN117370620A (zh) * 2023-12-08 2024-01-09 广东航宇卫星科技有限公司 一种数据血缘的构建方法、装置、终端设备及存储介质
CN117370620B (zh) * 2023-12-08 2024-04-05 广东航宇卫星科技有限公司 一种数据血缘的构建方法、装置、终端设备及存储介质

Also Published As

Publication number Publication date
CN115080599B (zh) 2022-11-25

Similar Documents

Publication Publication Date Title
CN115080599B (zh) 一种数据库查询sql字段血缘关系生成方法
Le-Phuoc et al. A native and adaptive approach for unified processing of linked streams and linked data
Simitsis et al. State-space optimization of ETL workflows
US7801913B2 (en) System and method for querying data for implicit hierarchies
Petit et al. Towards the reverse engineering of renormalized relational databases
US20130006968A1 (en) Data integration system
CN109947794B (zh) 一种交互式自然语言查询转换方法
US20050240615A1 (en) Techniques for identifying mergeable data
CN106991276B (zh) 一种基于openEHR模板的数据接口动态生成方法
Slepicka et al. KR2RML: An Alternative Interpretation of R2RML for Heterogenous Sources.
EP1222569A1 (en) Method and systems for making olap hierarchies summarisable
US20090043733A1 (en) Systems and methods for efficiently storing, retrieving and querying data structures in a relational database system
US9171051B2 (en) Data definition language (DDL) expression annotation
JP2001014329A (ja) データベース処理方法及び実施装置並びにその処理プログラムを記憶した媒体
US20180150544A1 (en) Synchronized updates across multiple database partitions
CN113934750A (zh) 基于编译方式的数据血缘关系分析方法
CN117093599A (zh) 面向异构数据源的统一sql查询方法
He et al. Stylus: a strongly-typed store for serving massive RDF data
Soutou Relational database reverse engineering: algorithms to extract cardinality constraints
Madaan et al. Quasi-relational query language interface for persistent standardized EHRs: Using NoSQL databases
Pardede et al. XML data update management in XML-enabled database
CN117076742A (zh) 数据血缘追踪方法、装置及电子设备
CN113221528B (zh) 基于openEHR模型的临床数据质量评估规则的自动生成与执行方法
Kudrass et al. Management of XML documents in object-relational databases
CN115757593A (zh) 一种数据处理方法、装置及存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant