最近因为工作关系,常需要写一些很复杂的查询语句,以支持前端做展示操作。
之前看到过很多程序员在面对这种复杂查询的时候,几乎是束手无策的,但是面对任务,到底该怎么办?
也许有人会说,有什么大不了的,再复杂的查询结果都可以拆分成一个个简单查询,我先查一组出来, 然后拿着这组结果在程序中或做拼接再查询或做循环查询,然后重复以上操作,程序中最终一定可以拿到你想要的结果。
可是你有没有想过, 这样的程序的效率怎么样?
可能有人会说,需求太复杂了,只能以牺牲效率来替换。
如果你只是一个程序员, 那么你确实尽力了,有这样的成果已经很不错了。可如果你是一个管理者,这是远远不够的, 因为你没有扬长避短,把资源各自的功能应用好。
写了这么多,主要是想给大家介绍一种解决这种问题的方案,可能不是最好,所以也期望您能分享更好的,以供大家学习。
在数据库层面或者SQL层面来处理,即写数据库函数、存储过程,或者写复杂的查询语句,具体怎么用得看您的业务。比如有需要把列信息转成一个行字段显示,一个字段以分隔符分隔存储了好几个ID,显示时需要转成NAME的等这样的需要通过数据库函数来处理,在你的SQL中直接调用就好;如果您的查询是与好多表进行关联,然后对结果集进行分组求记录数、分页等等这样的业务,您在写SQL的时候不访尝试一下With这个关键字来定义一些临时表,这会让您的SQL看起来很清晰,阅读起来很有结构,而且执行起来也会节约一些时间和空间。
如下是一我业务中用到的一条SQL,分享于大家:
WITH MKINFO AS
( SELECT MK.IX0037,MK.DS0005,MK.DS0025,MK.DS0010,DS0005.NAME DS0005NAME,DS0025.NAME DS0025NAME
FROM 主表 MK
JOIN D_AREA2 DS0005 ON MK.DS0005 = DS0005.CODE
JOIN D_HY2 DS0025 ON MK.DS0025 = DS0025.CODE
WHERE 1=1 AND DS0005 IN ('110000','130000','370000') AND DS0025='01'
AND TO_NUMBER(DS0010) BETWEEN 20104 AND 20133 ),
WDINFO AS
( SELECT MK.DS0005,MK.DS0025,MK.DS0005NAME,MK.DS0025NAME
FROM MKINFO MK
GROUP BY MK.DS0005,MK.DS0025,MK.DS0005NAME,MK.DS0025NAME )
SELECT MK.DS0005,MK.DS0025,MK.DS0005NAME,MK.DS0025NAME, DT.CODE DS0010,IX.IX0037
FROM WDINFO MK
JOIN D_DATE2 DT ON TO_NUMBER(DT.CODE) BETWEEN 20104 AND 20133
LEFT JOIN MKINFO IX ON MK.DS0005 = IX.DS0005 AND MK.DS0025 = IX.DS0025 AND IX.DS0010 = DT.CODE
ORDER BY DS0005,DS0010 。
我首先定义了一个MKINFO的临时表,这个表的信息来源于一个主表,这个表的信息来源于一个主表与其它几张表关联后摘取出来的字段,然后又定义了一个WDINFO的临时表,以确定所要查询的记录数,最后再以WDINFO为主做查询,解决特定业务需要的特定数据。
写SQL有很多技巧,大家从基础做起,逐渐去尝试写一些复杂的SQL,运用多了会在你的工作中起到事半功倍的效果。
相关推荐
在本文中,我们将深入探讨Java性能优化的关键点,帮助你的Java程序达到更快、更稳定的目标。 1. **JVM调优**:Java虚拟机(JVM)是Java程序运行的基础,优化JVM参数可以显著提升性能。例如,调整堆内存大小(-Xms和-...
在Java程序中嵌入Internet Explorer(IE)是一种常见的需求,特别是在需要在应用程序内部展示网页内容或者与Web服务交互时。这个过程主要涉及到Java的 SWT(Standard Widget Toolkit)库,它是Oracle公司开发的一个...
为了实现这一目标,需要在C/C++程序中使用JNI API来创建Java环境、加载类、调用方法等。 ##### 关键步骤: 1. **初始化Java环境**:使用JNI函数初始化Java环境。 2. **加载Java类**:查找并加载所需的Java类。 3. ...
当Java程序需要与Oracle数据库交互时,通常会用到JDBC(Java Database Connectivity)。JDBC提供了一种标准化的方式来访问数据库,其中`PreparedStatement`和`ResultSet`是两个关键接口。在设置Oracle的Timestamp ...
JDBC是Java平台的标准接口,它允许Java程序与各种类型的数据库进行交互,包括关系型数据库、非关系型数据库等。 在第一章"JDBC: Databases The Java Way!"中,作者Pratik Patel首先解释了什么是JDBC,这是一个Java...
这本书详尽地阐述了如何使用Hibernate进行数据持久化,从而帮助开发者在Java应用程序中高效地管理和操作数据库。 ORM框架如Hibernate是Java开发中的重要工具,它允许程序员使用面向对象的方式来处理数据库操作,...
在本书《Java EE 7 Development with WildFly》中,作者深入探讨了如何使用WildFly服务器进行Java EE 7应用程序开发。Java EE 7(Java Platform, Enterprise Edition 7)是Java企业级应用开发的一个重要版本,它引入...
在"Java语言程序设计进阶篇10th.pdf"中,作者详细讲解了以下几个关键知识点: 1. **多线程编程**:Java以其强大的并发支持而闻名。书中深入讨论了线程的创建、同步机制(如synchronized关键字、wait/notify机制和...
此外,Ant还支持属性(Properties),可以通过属性来存储配置信息,并在整个构建过程中使用它们。例如,在构建脚本中可以定义一个名为`main-class`的属性,用于指定应用程序的主类。 **使用JUnit进行测试** JUnit...
《Java+Persistence+with+Hibernate》是一本深入探讨如何在Java应用程序中利用Hibernate进行持久化开发的指南。这本书主要关注于使用Hibernate框架来处理数据库交互,以实现对象关系映射(ORM)。Hibernate作为Java...
通过以上步骤,我们可以构建一个简单的Java程序,实现从数据库读取表数据并转换为SQL文件的功能。不过,实际项目中可能需要考虑更多因素,如性能优化、事务处理、错误重试等。请确保在操作数据库时遵守最佳实践,以...
1. **Java程序设计基础**: - **类与对象**:Java是一种面向对象的编程语言,程序的核心是类和对象。在这个数据库小程序中,可能会定义一个或多个类,如`DatabaseConnection`和`QueryExecutor`,用于封装数据库连接...
程序中的"JDBC封装UI"标签可能意味着该程序结合了用户界面(UI),可能是使用Swing或JavaFX构建。UI部分负责接收用户输入,调用后台的JDBC操作,并显示查询结果。这涉及到事件监听、组件布局和数据绑定等概念。 ```...
首先,JDBC是Java平台的标准接口,它允许Java程序连接到各种类型的数据库,无论是Oracle、MySQL、SQL Server还是其他。要使用JDBC,你需要在项目中引入对应的数据库驱动jar包,例如mysql-connector-java.jar对于...
这篇博文主要总结了Java程序中与Oracle数据库交互的一些基本操作。通过`PersonCreditComplainDao.java`这个文件名,我们可以推测这是一个Java Dao(数据访问对象)类,它负责与数据库进行具体的交互。以下是关于Java...
标题中的问题“无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl”指出,这可能是Java Web应用开发中遇到的一个常见错误,涉及到JSP(JavaServer Pages)和JSTL(Java...
书中强调了多平台应用程序的开发,意味着开发者可以在Windows、Linux和Mac OS等多个操作系统上使用Java语言编写计算机视觉相关的应用程序。这种方式在当今多样化的操作系统环境中显得尤为重要。 在使用Java开发...
JDBC是一个Java API,允许Java程序执行SQL语句,与关系型数据库进行交互。JDBC接口定义了数据库连接、SQL语句执行、结果集处理等操作的标准方法,Java开发者可以利用JDBC API编写代码来创建和管理数据库。 数据库...