程序架构探讨—001 查询语句中多段select语句的方案

有时候,我们需要做多条件查询,多个条件为“或”的关系,分类查询等,一般会用到多段select语句,然后用union或者union all进行连接,进而查出需要的结果。
例如,
select
a.id as id,
a.name as name,
a.age as age
from scama.table_name2 a
where 1=1

union all

select
b.sn as id,
b.name as name,
b.age as age
from scama.table_name2 b
where 1=2

union all

select
c.serial_id as id,
c.name as name,
c.age as age
from scama.table_name3 c
where 1=3
;
此时程序实现时,存在不少的麻烦。例如,大段的相似的sql容易出错,后续的维护的不方便,以及如果程序拼接了sql后传递给数据库执行带来的性能问题等等。
那么如何进行更好的改进实现呢?
方式有很多,博主根据自己的经验提供如下两种方案可供参考。
1、将各段查询语句,分开调用
将每段select单独写方法调用,最后再将每个调用的结果汇总为结果。
例如,
datatable dt1= 调用第一段的sql的结果;
datatable dt2= 调用第二段的sql的结果;
...
依次查询完成,最后合并dt1,dt2....
这种方案针对前台程序将sql拼接为字符串,通过程序本身框架内实现的与数据库的连接方式,执行sql语句。

2、后台完成,将查询的结果写入临时表或者中间表,直接查询该表的结果
即,使用存储过程或者函数,将需要查询的多条sql语句插入至一张临时表(物理表也可),然后返回结果。
这种方式,因为是在数据库中完成,那么有些需要查询的字段,就可以单独写语句查询出来再赋值给当前结果。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-26 22:45:04

程序架构探讨—001 查询语句中多段select语句的方案的相关文章

程序架构探讨—001 多段select语句的方案

有时候,我们需要做多条件查询,多个条件为"或"的关系,分类查询等,一般会用到多段select语句,然后用union或者union all进行连接,进而查出需要的结果. 例如, select a.id as id, a.name as name, a.age as age from scama.table_name2 a where 1=1 union all select b.sn as id, b.name as name, b.age as age from scama.table

查询EBS中LOV的SQL语句

帮助->关于 会话 SID : 507 DECLARE  l_sid NUMBER := :SID;BEGIN  FOR cur_sql IN (SELECT sql_text                    FROM v$sqltext_with_newlines t                   WHERE t.address IN (SELECT s.prev_sql_addr                                         FROM v$ses

Android入门(五):程序架构——MVC设计模式在Android中的应用

刚刚接触编程的的人,可能会这样认为:只要代码写完了能够跑起来就算完工了.如果只是写一个小程序,“能够跑起来”这样的标准也就可以了,但是如果你是在公司进行程序的开发,那么仅仅让程序成功的跑起来是不行的,事情远没有你想的这么简单.一个商业项目的代码少则数万行,多则上百万甚至更多,这种商业项目不可能仅仅靠一个人完成,要想高效高质量的完成开发工作,就需要一个专业的开发团队了.在团队中,有人负责项目的架构设计,有些人负责程序代码的编写….要想像这样做到项目开发的分工就必须在程序的结构上做适当的安排. 举个

mysql中常用的select语句记录

1:带条件查询,查询ID=2的数据 SELECT * FROM table WHERE ID = 2 2:查询前几条数据,如查询前2条数据 SELECT * FROM table LIMIT 2

SQL语句中 int 溢出 + Asp语句中 Long 溢出

晚上5点多,同事在QQ告诉我,一个用户向他反应,在他登录的时候显示错误信息,我们在管理平台查看该用户的基本信息时,也显示错误信息. 经过初步分析,原来是在执行 SQL语句的时候发生Int溢出: sql = "select sum(fileSize) as fsTotal from pic where userID = 1632" 本来这段SQL是用来取得一个用户之前上传的所有文件大小的合计数. fileSize 字段类型 int 当用户上传的文件累计大小超过 2G(2147483648

MYSQL优化派生表(子查询)在From语句中的

Mysql 在5.6.3中,优化器更有效率地处理派生表(在from语句中的子查询): 优化器推迟物化子查询在from语句中的子查询,知道子查询的内容在查询正真执行需要时,才开始物化.这一举措提高了性能: 1:之前版本(5.6.3),from语句中的子查询在explain select 查看执行计划语句执行时就会物化.它导致了部分查询执行,但explain语句的目的是获取执行计划信息,而不是执行查询 该版本物化不会在explain中发生,所以explain执行计划结果的得到更快: 2:因为上面提及

try~Catch语句中异常的处理过程

[2014/10/12 21:40]文章待续~ 1.函数自身捕获处理异常的情况 下面的例子介绍了try~catch语句中出现异常时语句的执行顺序: package month10; import java.lang.*; public class TryCatch{ /* * 函数产生一个ArithmeticException异常 */ public static void First(){ System.out.println("第一个异常处理的例子"); try{ //double

SQL操作语句中的注意点

一 查询语句 1 distinct关键字消除重复行 当查询的结果数据中出现重复数据时,在查询条件中加上distinct关键字消除重复行: 如:select distinct Sno from SC; 2 like匹配的通配符%和_ % :代表任意长度(包括0)的字符串,例如:like'a%b',表示以a开头,以b结尾的任意长度的字符串: _ :代表任意单个字符,注意数据库的字符集为ASCII时一个汉字需要两个_,当字符集为GBK时只需要一个_,例如:like'欧阳__': 注:当要查询的字符串本

Sqlserver中使用Select语句给变量赋值的时候需要注意的一个问题

我们知道在SqlServer中可以用Select语句给变量赋值,比如如下语句就为int类型的变量@id赋值 1 declare @id int=-1; 2 3 select @id=id from 4 ( 5 select 1 as id 6 union all 7 select 2 as id 8 union all 9 select 3 as id 10 ) as t 11 12 select @id 执行上面的代码会显示下面的查询结果,结果显示最后@id的值为3,那么意味着上面第3行的se