YonQL使用指南

注:YonQL的语法类似mysql,所以如果 有mysql基础的同学,看一眼 就会YonQL;没有sql基础的小伙伴,也不要紧,通过我们这篇文档的学习,也能轻松掌握。

注意事项

  • 主元数据不允许有别名, ⼦元数据必须有别名:
  • 1, 单表查询, 元数据不允许有别名
  • 2, 多表查询, 主元数据不允许有别名, ⼦元数据必须有别名
  • 3, ⽬前⽀持left join, inner join, 暂不⽀持right join 示

select xiaoshu,wenben,duoyuwenben, b.dawenben bbb,replace(shoujihao,"4","zzzz"),substr(shoujihao,6)
from GT72166AT360.GT72166AT360.quanshiti0107 left join GT72166AT360.GT72166AT360.qq0107 b on   wenben = b.wenbenlimit param$(sfs)

select*from GT72166AT360.GT72166AT360.quanshiti0107 leftjoin GT72166AT360.GT72166AT360.qq0107 b on   wenben = b.wenben left join GT72166AT360.GT72166AT360.zhu0107 c on b.wenben= c.wenben

select wenben,shuzhi,shijianfrom GT72166AT360.GT72166AT360.quanshiti0107 left join GT72166AT360.GT72166AT360.qq0107 b on   wenben = b.wenbengroupby wenben,shuzhi,shijianlimit100

select wenben,shuzhifrom GT72166AT360.GT72166AT360.quanshiti0107 left join GT72166AT360.GT72166AT360.qq0107 b on   wenben = b.wenbenwhere wenben  in("yfx","xxx")limit100

selectcodefrom GT72166AT360.GT72166AT360.quanshiti0107 left  join GT72166AT360.GT72166AT360.qq0107 b on   wenben = b.wenbenorderbycodedesclimit100

selectcode,wenbenfrom GT72166AT360.GT72166AT360.quanshiti0107 innerjoin GT72166AT360.GT72166AT360.zhu0107 a on  a. wenben = b.wenben left join GT72166AT360.GT72166AT360.qq0107 b on   wenben = b.wenbenorderbycodedesclimit100

select Merchant,Product,shijian,shijianriqi,code,ctrttype,fujian,modifier,parentfrom GT72166AT360.GT72166AT360.quanshiti0107 left join GT72166AT360.GT72166AT360.qq0107 a

一、单表查询

1、简单查询

  • 释义    通过比较符,对数据进行过滤查询
释义 关键字 语句(from 后边为数据建模下的实体的URI) 备注
全模糊查询 like select * from GT22161AT175.GT22161AT175.province where provinceName like \'山\' ("山"、山) like 不需要加%,会自动转换成 like %山%,如果加上%,会被转义成 %\%山\%%
左模糊查询 leftlike select * from GT22161AT175.GT22161AT175.province where provinceName leftlike \'河\'("河"、河) like '河%',不需要加%
右模糊查询 rightlike select * from GT22161AT175.GT22161AT175.province where provinceName rightlike \'东\'("东"、东) like '%东',不需要加%
剔除全模糊查询部分 not like 不支持  
等于 = select * from GT22161AT175.GT22161AT175.province where provinceName= \'山东\' \'山东\' 或者 "山东"
不等于 != select * from GT22161AT175.GT22161AT175.province where provinceName != \'山东\' \'山东\' 或者 "山东"
不等于 <> select * from GT22161AT175.GT22161AT175.province where provinceName <> \'河北\' \'河北\' 或者 "河北"
大于 > select * from GT22161AT175.GT22161AT175.province where provinceCode > 1 1、\'1\'、"1" 都可
大于等于 >= select * from GT22161AT175.GT22161AT175.province where provinceCode >= 2 2、\'2\'、"2" 都可
小于 < select * from GT22161AT175.GT22161AT175.province where provinceCode < 3 3、\'3\'、"3" 都可
小于等于 <= select * from GT22161AT175.GT22161AT175.province where provinceCode <= 2 2、\'2\'、"2" 都可
在..和..之间 between and select * from GT22161AT175.GT22161AT175.province where provinceCode between 1 and 3 1、\'1\'、"1"
不在..和..之间 not between and 不支持,改写为 select * from GT22161AT175.GT22161AT175.province where provinceCode > 4 or provinceCode < 2
包含..的部分 in select * from GT22161AT175.GT22161AT175.province where provinceCode in (1,2,3) in (1,2,3)、in ("1","2","3")、 (\'1\',\'2\',\'3\')
不包含..的部分 not in select * from GT22161AT175.GT22161AT175.province where provinceCode not in(1,2,3) not in (1,2,3)、not in ("1","2","3")、 not in (\'1\',\'2\',\'3\')
为null is null select * from GT22161AT175.GT22161AT175.province where cityCode is null 不同于cityCode=\'\'
不为null的部分 is not null select * from GT22161AT175.GT22161AT175.province where cityCode is not null 不同于 cityCode !=\'\'
总条数 count() select count(1) cnt from GT22161AT175.GT22161AT175.province count(id) 也可以 (count(*)不可用、count(业务字段) 需要考虑字段是否为空的情况、系统只会计数字段为 is not null的件数)
多条件查询 and/or select * from GT22161AT175.GT22161AT175.province where provinceName like \'山\' and (provinceCode=2 or cityCode rightlike 1)  
注:YonQL简单查询 语法和mysql的基本一致,除了like模糊查询

2、分页查询

  • 释义    分页查询数据(limit)
分页 语法 备注
select * from GT22161AT175.GT22161AT175.province where dr = 0 order by cityCode asc limit 2,6 limit page,size (例:8条数据、size是每页6条数、即:一共两页数据。返回page=2 的内容 (dr=0 未删除的数据))
注:与mysql的区别:mysql的limit的第一参数是开始获取数据的下标,第二个参数是该下标后要返回数据的条数。没有自动计算分页

二、 多表查询

前期数据准备

实体创建

主实体
操作 描述
名称
编码 main
父实体
引用接口
业务属性 编码 名称 类型 引用
mainName 主名称 文本
mainCode 主编码 文本  
子实体
操作 描述
名称
编码 son
父实体
引用接口
业务属性 编码 名称 类型 引用
sonName 子名称 文本
sonCode 子编码 文本  
孙实体
操作 描述
名称
编码 grandson
父实体
引用接口
业务属性 编码 名称 类型 引用
grandsonName 孙名称 文本
grandsonCode 孙编码 文本  

实体创建完毕后数据结构

图10 图11 图12 图13 图14

注意:主、子、孙表之间的引用关系:

图
比如 主表中的 sonList属性 其实有两个“身份”,一是作为主表的字段属性;二是作为子表的实例引用对象,就是在组合查询中可以通过它直接获取子表中的属性。(子表中的 grandsonList同上)

3、子查询

  • 释义    通过定义where 条件之后的子查询,对数据的过滤查询。
子查询 语法 备注
in子查询 select son_id.main_id.mainCode as mainCode, son_id.main_id.mainName as mainName,son_id.sonCode as sonCode,son_id.sonName as sonName,grandsonCode,grandsonName from GT22161AT175.GT22161AT175.grandson where son_id.main_id in (select id from GT22161AT175.GT22161AT175.main where mainName rightlike '1')
注:和mysql语法一样

4、组合查询(基于关联关系或者引用关系)

  • 释义    通过组合查询语法,返回树形结构。
组合查询 语法 备注
①主子组合查询 select id,mainCode,mainName,(select sonCode,sonName from sonList) from GT22161AT175.GT22161AT175.main where dr = 0 order by mainCode, sonList.sonCode 关联属性必须作为查询结果。比如默认父实体的id和子实体中的main_id为关联属性,必须在结果集中存在。否则子实体查询不出来。
②子孙组合查询 select id,sonCode,sonName,(select grandsonCode,grandsonName from grandsonList) from GT22161AT175.GT22161AT175.son where dr = 0 order by sonCode, grandsonList.grandsonCode
③主子孙组合查询 select id,mainCode,mainName,(select sonCode,sonName,(select grandsonCode,grandsonName from grandsonList) from sonList) from GT22161AT175.GT22161AT175.main where dr = 0 order by mainCode 主子孙层级结构
组合查询rel关联 select id,sonCode,sonName,(select grandsonCode,grandsonName from grandsonList) where son_id = son_id.id from GT22161AT175.GT22161AT175.son where dr = 0 order by sonCode, grandsonList.grandsonCode  
注:组合查询 是mysql没有的查询语法,它可以实现一条sql就可以返回树型结构。它使用的前提是实体之间要有 关联关系,比如主子表。

5、关联查询(基于关联关系或者引用关系)

1)基于关联关系(主子表)

  • 释义     对主子元数据接口的关联查询
关键字 语法 备注 其他关键字
left join select son_id.main_id.mainCode as mainCode,
son_id.main_id.mainName as mainName,
son_id.sonCode,son_id.sonName,
grandsonCode,grandsonName
from GT22161AT175.GT22161AT175.grandson
left join son_id son on son_id=son.id
left join son_id.main_id main
1)结果集不能使用t.*,必须写清楚属性名。运行时会报错
2)如果关联关系在元数据中存在,不需要写关联条件
left join、left alone join、 inner join、inner alone join、alone join、等
  • (此处用api函数发布接口为示例) 上面的SQL都可在此位置进行验证、观察返回的数据层级、根据实际需求确定具体的SQL查询方式
  • API函数如下: 图08 图09
  • ③ 代码部分(sql部分可用上边SQL代替)
     let AbstractAPIHandler = require('AbstractAPIHandler');
       class MyAPIHandler extends AbstractAPIHandler {
        execute(request) {
          var sql = "select son_id.sonCode,son_id.sonName,grandsonCode,grandsonName,son_id.main_id.mainCode as mainCode,son_id.main_id.mainName as mainName from GT22161AT175.GT22161AT175.grandson left join son_id son on son_id=son.id left join son_id.main_id main on son_id.main_id.id =main.id";
          var res = ObjectStore.queryByYonQL(sql);
        return {res};
      }
     }
     exports({"entryPoint":MyAPIHandler});
    

2)基于引用关系(引用参照)

  • 创建测试实体
    • 实体1:党组织
      图
    • 实体2:党员
      图
      党员中的一个字段 单选引用 党组织。
  • 创建页面

    • 党组织 发布为参照
      图
    • 党员
      创建两个页面后,维护部分数据
  • 创建API函数

    let AbstractAPIHandler = require('AbstractAPIHandler');
    class MyAPIHandler extends AbstractAPIHandler {
     execute(request){
    
      // 入参:党组织名称 
      var mecName = request.mecName;
    
      // 根据入参党组织查询该党组织下所有党员数据
      var sql = "select dangzuzhiid.jianchen,xingming,rudangriqi,xueli from GT27287AT208.GT27287AT208.zs_Members  left join dangzuzhiid d on dangzuzhiid = d.id where dangzuzhiid.jianchen = '"+ mecName + "' " //+ mecName ;
      var res = ObjectStore.queryByYonQL(sql)
    
     return {res};
    }
    }
    exports({"entryPoint":MyAPIHandler});
    

API调用测试:
图

注:与mysql的区别:它使用的前提是实体之间要有 关联关系,比如主子表或两个元数据之间有单选引用关系 才可以使用。

三、常见问题

1.YonQL是什么?

YonQL是 YonBuilder标准版开发者 查询数据的 桥梁。因为 YonBuilder标准版 是公有云开发,标准版创建的表是在平台的系统库,开发者不能直接操作数据库数据;所以有了YonQL 。

2.标准版自建表和系统表 关联查询 是否支持?

自建和系统表 不支持 关联查询; 因为YonQL查询时,其实是需要传domainKey参数的,比如:
ObjectStore.queryByYonQL(sql,"developplatform")
只不过,标准版自建表的查询第二个参数是“developplatform”可以省略;但系统表查询时,必须传第二个参数(领域的domainKey) 。
如果业务上有这种场景,系统表和自建表可以分开查询

//案例:系统员工实体 和 自建实体的 ‘关联’查询

    //查询 原厂-员工的name(ucf-staff-center 是员工所在领域的domainKey)
    var sql_staff = "select name from    bd.staff.StaffNew " ; 
    var nameObj = ObjectStore.queryByYonQL(sql_staff,"ucf-staff-center"); 

    var nameArr = []
    for (let key in nameObj) {
        nameArr.push(nameObj[key].name); 
    }
    var str = JSON.stringify(nameArr);    //  "[\"YonBuilder小助手\",\"测试员工\",\"张三\"]"
    str = str.substring(1,str.length - 1) //   "\"YonBuilder小助手\",\"测试员工\",\"张三\""

    //根据查询系统表的结果集 作为条件 查询自建表
    var sql = 'select new1,new2 from GT27287AT208.GT27287AT208.zs_two where new1 in (' + str +')'    
    var res = ObjectStore.queryByYonQL(sql)
注:原厂单据 支持YonQL查询 标准版自建单据(不支持查专业版,专业版通过后端脚手架 灵活查询即可) ; 另外,标准版/专业版 自建单据 支持查询 原厂单据(需要传domainKey)

3.子查询、关联查询、组合查询 都是 多表查询,那他们有什么区别点吗?

  • 组合查询:通过组合查询语法,返回树形结构。【在查询时,对于组合关系的实体, 有时需要有层级结构的数据,即主子孙层级结构,或者也可以将关联实 体的组合实体数据绑定到该实体对象上,这时可以使用组合查询方案】
  • 子查询:通过定义where 条件之后的子查询,对数据的过滤查询 【子查询 可以理解为 两个简单查询的 组合;子查询的返回结果集 作为 外部查询的 条件 来进一步数据过滤】
  • 关联查询:通过定义关联查询条件,完成对主子元数据的join查询

注意:组合查询、关联查询 的使用前提:基于关联关系(主子关系)或者引用关系(单选引用关系)
建议:当满足这个前提是 建议使用 这两种查询。
子查询 对比 关联查询:join更智能些,可以根据 优化器 查询,子查询不能(子查询 先对外面表全表扫描 再根据子查询结果集 进一步过滤 ,当数据量较大时,sql性能较差,不建议使用。)

4.专业版通过YonQL查询自建实体报错:查询的表不存在

专业版不支持通过YonQL查询自建实体(网络隔离),专业版 可以通过 后端脚手架 查询。(YonQL主要给标准版使用的)

Copyright © 用友 -【生态技术部】 2021 all right reserved,powered by Gitbook修订时间: 2022-02-18 18:53:00

results matching ""

    No results matching ""