设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2662|回复: 5
打印 上一主题 下一主题

[查询] 用Select 的高级查询,提高程序执行效率?

[复制链接]
跳转到指定楼层
1#
发表于 2006-8-23 02:10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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编辑过]

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2006-8-23 16:04:00 | 只看该作者
查case帮助。
3#
 楼主| 发表于 2006-8-23 23:00: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]
4#
 楼主| 发表于 2006-8-23 23:34:00 | 只看该作者
又解决了!真是想不到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编辑过]

5#
发表于 2006-8-24 16:42:00 | 只看该作者
用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 ;
6#
 楼主| 发表于 2006-8-29 05:32:00 | 只看该作者
不错,该函数实现的功能也正是我需要的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-3 16:06 , Processed in 0.102881 second(s), 29 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表