SQL 嵌套 N 层太长太难写怎么办?(二)

简介: SQL 嵌套 N 层太长太难写怎么办?

超越SQL的能力


SPL不仅覆盖了SQL的所有计算能力,还提供了更强大语言功能。基于这些特性可以很方便原来在SQL中不易完成的运算,简化复杂计算可不是开玩笑的。


离散性及其支持下的更彻底的集合化


集合化是SQL的基本特性,即支持数据以集合的形式参与运算。但SQL的离散性很不好,所有集合成员必须作为一个整体参于运算,不能游离在集合之外。而Java等高级语言则支持很好的离散性,数组成员可以单独运算。但是,更彻底的集合化需要离散性来支持,集合成员可以游离在集合之外,并与其它数据随意构成新的集合参与运算 。


SPL兼具了SQL的集合化和Java的离散性,从而可以实现更彻底的集合化。


SPL很容易表达“集合的集合”,适合分组后计算。比如,找到各科成绩均在前10名的学生:


A
1 =db.query(“select * from score”) .group(subject)
2 =A2.(~.rank(score).pselect@a(~<=10))
3 =A1.(~(A3(#)).(name)).isect()


有序支持


有序计算是离散性和集合化的典型结合产物,成员的次序在集合中才有意义,这要求集合化,有序计算时又要将每个成员与相邻成员区分开,会强调离散性。SPL兼具集合化和离散性,天然支持有序计算。


具体来说,SPL可以按绝对位置引用成员,比如,取第3条订单可以写成Orders(3),取第1、3、5条记录可以写成Orders([1,3,5])。


SPL也可以按相对位置引用成员,比如,计算每条记录相对于上一条记录的金额增长率:

Orders.derive(amount/amount[-1]-1)

SPL还可以用#代表当前记录的序号,比如把员工按序号分成两组,奇数序号一组,偶数序号一组:

Employees.group(#%2==1)

在有序计算的支持下,再处理结构化数据计算中关于次序的运算(诸如比上月、比去年同期、前 20%、排名等)就很方便了。


对象引用


SPL序表的字段可以存储记录或记录集合,这样可以用对象引用的方式,直观地表达关联关系,即使关系再多,也能直观地表达。比如,根据员工表找到女经理下属的男员工:

Employees.select(gender:"male",department.manager.gender:"female")


更方便的函数语法


提供大量功能强大的结构化数据计算函数本来是一件好事,但这会让相似功能的函数不容易区分,无形中提高了学习难度。


SPL提供了特有的函数选项语法,功能相似的函数可以共用一个函数名,只用函数选项区分差别。比如select函数的基本功能是过滤,如果只过滤出符合条件的第1条记录,可以使用选项@1:

Orders.select@1(Amount>1000)

数据量较大时,用并行计算提高性能,只须改为选项@m:

Orders.select@m(Amount>1000)

对排序过的数据,用二分法进行快速过滤,可用@b:

Orders.select@b(Amount>1000)

函数选项还可以组合搭配,比如:

Orders.select@1b(Amount>1000)

结构化运算函数的参数常常很复杂,比如SQL就需要用各种关键字把一条语句的参数分隔成多个组,但这会动用很多关键字,也使语句结构不统一。SPL支持层次参数,通过分号、逗号、冒号自高而低将参数分为三层,用通用的方式简化复杂参数的表达:

join(Orders:o,SellerId ; Employees:e,EId)


方便的编辑调试功能


与SQL难用的编辑调试功能不同,SPL提供了简洁易用的开发环境,单步执行、设置断点,所见即所得的结果预览窗口…,使得开发调试效率更高。

image.png

SPL采用了网格式编码方式,代码不仅天然对齐层次清晰,在实施过程计算时可以直接使用格子名称来引用上一步的计算结果而不必费心定义变量(虽然也支持)非常方便。好用的开发环境自然起到事半功倍的效果,进一步简化复杂计算实施难度。


应用集成、低耦合与热切换


SPL提供了标准应用接口(JDBC/ODBC/RESTful)可以很方便与应用集成。尤其对于Java应用可以将SPL作为嵌入引擎集成,使得应用本身就具备强数据计算能力。


JDBC调用SPL 代码示例:

Class.forName("com.esproc.jdbc.InternalDriver");
Connection conn =DriverManager.getConnection("jdbc:esproc:local://");
Statement st = connection.();
CallableStatement st = conn.prepareCall("{call splscript(?, ?)}");
st.setObject(1, 3000);
st.setObject(2, 5000);
ResultSet result=st.execute();

同时,SPL采用解释执行机制,天然支持热切换。这样对于稳定性差、经常需要新增修改的数据处理需求非常友好。SPL脚本可以与Java程序独立,外置在Java之外,修改和维护都可以独立进行,脚本修改上传后就能实时生效,保证应用可以不中断地提供数据服务。


SPL外置算法不仅能有效降低应用与数据库的耦合性,独立的SPL模块还可以进一步降低应用各个模块间的耦合性,使得结构更为清晰,架构也更为合理。


总结一下,SPL之所以更简单是因为SPL相当于结合了SQL和其他高级语言(如Java)的优点,并在此基础上增加了诸多特性让复杂计算不再难写,同时可以与应用完美结合使得应用架构更为合理。有了SPL的帮助,我们相信,未来的某一天上千行的复杂SQL将不复存在。


SPL资料


  • SPL下载
  • SPL源代码
相关文章
|
2月前
|
SQL 数据库 开发者
SQL中的子查询:嵌套查询的深度解析
【8月更文挑战第31天】
130 0
|
2月前
|
SQL 数据挖掘 数据库
SQL 子查询深度剖析来袭!嵌套查询竟有如此无限可能,带你轻松玩转复杂数据检索与操作!
【8月更文挑战第31天】在 SQL 中,子查询是一种强大的工具,允许在一个查询内嵌套另一个查询,从而实现复杂的数据检索和操作。子查询分为标量子查询、列子查询和行子查询,可用于 SELECT、FROM、WHERE 和 HAVING 子句中。例如,查找年龄大于平均年龄的学生或每个课程中成绩最高的学生。子查询具有灵活性、可重用性和潜在的性能优化优势,但需注意性能问题、可读性和数据库支持。合理使用子查询能够显著提升查询效率和代码维护性。
50 0
|
5月前
|
SQL 关系型数据库 MySQL
简简单单 My SQL 学习笔记(3)——连接和嵌套查询
简简单单 My SQL 学习笔记(3)——连接和嵌套查询
|
5月前
|
SQL 分布式计算 大数据
MaxCompute操作报错合集之在sql 里嵌套查询时,查询条件带有instr时报错,如何解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
11月前
|
SQL
在sql 里嵌套查询时,查询条件带有instr时报错
在sql 里嵌套查询时,查询条件带有instr时报错
93 1
|
12月前
|
SQL Java 数据处理
【其他】SQL 嵌套 N 层太长太难写怎么办?
【其他】SQL 嵌套 N 层太长太难写怎么办?
30 1
|
SQL 存储 算法
SQL 嵌套 N 层太长太难写怎么办?
SQL 嵌套 N 层太长太难写怎么办?
61 0
|
SQL Java 数据处理
SQL 嵌套 N 层太长太难写怎么办?
SQL 嵌套 N 层太长太难写怎么办?
125 0
SQL 嵌套 N 层太长太难写怎么办?
|
SQL 存储 算法
SQL 嵌套 N 层太长太难写怎么办?(一)
SQL 嵌套 N 层太长太难写怎么办?
156 0
|
SQL Perl 存储
PL/SQL 嵌套记录与记录集合
    将多个逻辑上不相关列组合到一起形成了PL/SQL的记录类型,从而可以将记录类型作为一个整体对待来处理。而且PL/SQL记录类型可以进行嵌套以及基于PL/SQL记录来定义联合数组,嵌套表等。
926 0
下一篇
无影云桌面