在JAVA程序中使用with

最近因为工作关系,常需要写一些很复杂的查询语句,以支持前端做展示操作。
之前看到过很多程序员在面对这种复杂查询的时候,几乎是束手无策的,但是面对任务,到底该怎么办?
也许有人会说,有什么大不了的,再复杂的查询结果都可以拆分成一个个简单查询,我先查一组出来, 然后拿着这组结果在程序中或做拼接再查询或做循环查询,然后重复以上操作,程序中最终一定可以拿到你想要的结果。
可是你有没有想过, 这样的程序的效率怎么样?
可能有人会说,需求太复杂了,只能以牺牲效率来替换。
如果你只是一个程序员, 那么你确实尽力了,有这样的成果已经很不错了。可如果你是一个管理者,这是远远不够的, 因为你没有扬长避短,把资源各自的功能应用好。
写了这么多,主要是想给大家介绍一种解决这种问题的方案,可能不是最好,所以也期望您能分享更好的,以供大家学习。

在数据库层面或者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,运用多了会在你的工作中起到事半功倍的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值