Office中国论坛/Access中国论坛
标题: 用Select 的高级查询,提高程序执行效率? [打印本页]
作者: duanpeng@ 时间: 2006-8-23 02:10
标题: 用Select 的高级查询,提高程序执行效率?
Select lfid AS 缴费年度,bldCByf As 参保月份,jffs As 缴费方式,ZJFFID AS 审核
From YBzgsj
WHERE zgid =58
ORDER BY lfid;
得缴费记录集:
缴费年度 参保月份 缴费方式 审核
2006 1 1 null
2005 1 2 -1
如何用SQL语句实现:
缴费年度 参保月份 缴费方式 审核
2006 1 1 null
2005 1 2 是
(把审核列中的所有-1转变为“是”)
当然用程序可以简单实现例如ADO,但处理效率不高。如果能直接用SQL语句实现就简单得多了。
[此贴子已经被作者于2006-8-23 15:00:45编辑过]
作者: wuaza 时间: 2006-8-23 16:04
查case帮助。
作者: duanpeng@ 时间: 2006-8-23 23:00
看帮助后,自己解决了,而且学到了更多的知识,如下:
Select SUBSTRING(lfid,1,4) + '年' AS 缴费年度,
CAST(bldCByf AS char(2)) +'月' As 参保月份,jffs As 缴费方式
(Select '已审' as '审核'WHERE YBzgsj.ZJFFID =-1 ) AS 缴费
From YBzgsj
WHERE ZGid =1120
ORDER BY lfid ;
利用子查询能解决单个值的实现,会得到如下记录集
缴费年度 缴费月份 缴费方式 审核
2005年 1 月 1 NULL
2004年 1 月 2 已核
2003年 1 月 3 已核
睢:自动在年度中加上了年,在月份中自动加上了月,审核字段中的-1值自动显示为“已核”。
这样减少了应用中编程处理的麻烦,同时也提高了执行效率。
不过还有个问题,大家注意“缴费方式”在库中是以数值(1,2,3)表示不同的缴费方式,但实际中缴费方式可能有4种缴费方式或更多。
考虑用一“字典表”Z_ZD
ID JFFS
1 单基数缴费
2 双基数缴费
3 个人承担
问题来了,能不能用字典表Z_ZD,自动对应到表YBzgsj中去。
即生成:
缴费年度 缴费月份 缴费方式 审核
2005年 1 月 单基数缴费 NULL
2004年 1 月 双基数缴费 已核
2003年 1 月 个人承担 已核
本人正在测验中,有兴趣的朋友可以试试。如果你是高手请直接指引一二,让我少走弯路。
[em06][em06]
作者: duanpeng@ 时间: 2006-8-23 23:34
又解决了!真是想不到SQL语言真是太强大了,以前处理这些效果,都要在程序中利用ADO连接取得记录集对像后,循环修改相当的记录值改变(当然在ACCESS中用子窗体也能简单解决),但直接用SQL提供的子查询更是简单,更是方便。
Select SUBSTRING(lfid,1,4) + '年' AS 缴费年度,
CAST(bldCByf AS char(2)) +'月' As 参保月份,
(Select jffs From z_JFFS WHERE z_JFFS.ID = YBzgsj.jffs) AS 缴费方式,
(Select '已审' WHERE YBzgsj.ZJFFID =-1 ) AS 审核
From YBzgsj
WHERE zgid =1120 ORDER BY lfid ;
得结果
缴费年度 缴费月份 缴费方式 审核
2005年 1 月 单基数缴费 NULL
2004年 1 月 双基数缴费 已核
2003年 1 月 个人承担 已核
分析:“缴费方式”不是直接用字段JFFS(请与顶楼对比)而是来源与表Z_JFFS(字典),当然这里是有条件的请看Select...的第三行(是一个子查询)。大家有兴趣,自己研究一下吧。
总结:ACCESS虽然给我们编程的平台,但一些处理结果并不是一定要用VBA+ADO代码来完成,其实在SQL数据库系统中可以自行判断处理(例如利用身份证号生成出生日期,年龄,以及表与表之间的“交叉统计取值”这些都交给SQL库系统),这样效率更高。这对程序的扩展会非常有利,特别是当你要开发大中型应用时这一点很重要。
以上纯属个人学习领会,不对之处请各位纠正。
[此贴子已经被作者于2006-8-23 15:35:12编辑过]
作者: wuaza 时间: 2006-8-24 16:42
用case不是更方便吗?
Select SUBSTRING(lfid,1,4) + '年' AS 缴费年度,
CAST(bldCByf AS char(2)) +'月' As 参保月份,
case 缴费方式 when 1 then 单基数缴费 when 2 then 双基数缴费 when 3 then 个人承担 end ,
case 审核 when -1 then 已审核 end
From YBzgsj
WHERE zgid =1120 ORDER BY lfid ;
作者: duanpeng@ 时间: 2006-8-29 05:32
不错,该函数实现的功能也正是我需要的。
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) |
Powered by Discuz! X3.3 |