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