ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 6016|回复: 9

[原创] 关于ACCESS子查询的问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-12-9 12:48 | 显示全部楼层 |阅读模式
我有一个数据库200万行数据,是连续每天(dd)的数据合并的,每天的记录有多个柜员(gy)的数据合并的,每个柜员有多套(th)记录合并的,每套里有若干笔业务。
现在我要求查询包含某种性质的业务的整套记录:
如某一套业务(至少2笔)
dd               th  sx  hsm    occ          gy            其它字段略
20080101  15  1  5185   1000.00  5101
20080101  15  2  8131  -1000.00  5101
因为已知条件是告诉你hsm=5185  而要求返回这一整套。
若按性质查如where hsm=5185,筛选所有结果都是单笔的,所以我考虑用子查询,且dd&th&gy 这三个条件缺一不可,只有这样才能保证筛选记录的唯一性。

可是下面第一句,每次执行,总是没有结果,有死机的感觉,任务管理器中发现CPU使用未到100%,至于第二、三句,其实只是第一句拆开执行而已,却都能瞬间完成。
当然这样也不现实,因为第二句中,现在我只是根据第三句的结果手工挑选了2个。
代码是在EXCEL-VBA中执行的。
在此只好再次向各位老师请教,这第一句出了什么问题?谢谢


1、select * from 111 where dd&th&gy in (select dd&th&gy from 111 where hsm=5185)
2、select * from 111 where dd&th&gy in ('200802135DD40','2008032110DB39')
3、select dd&th&gy from 111 where hsm=5185

TA的精华主题

TA的得分主题

发表于 2008-12-10 07:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
加个别名
select * from 111 where dd&th&gy in (select dd&th&gy from 111 where hsm=5185) as tb

TA的精华主题

TA的得分主题

发表于 2008-12-10 07:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我上面说错了,不算

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-12-10 12:19 | 显示全部楼层
非常感谢meeting 老师
我想,这种方式应该是可以的,肯定存在一些未被发现的问题,在还没有解决以前,
我用了一种不是办法的办法:
就是在数据库中增加了一列:ddthgy
还是通过子查询操作,运行效果不错。
但是,付出的代价是:数据库从180MB变成了220MB
而且今后不可能总为了一种查询而添加一个字段。
所以请走过路过的各位老师留意,不管成功与否,希望能提出一些思路,本人万分感谢。

TA的精华主题

TA的得分主题

发表于 2008-12-10 15:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
1.查询自定义一个表达式的字段为ddthgy
2.没看明白你所举例子,从第一句来看,是要查找一数据集:但从你下面分解开的第二句,我就弄不明白了,你举的两个例子条件好象也长短不一致,
3.从三句语句来看,为什么不是
select [111] .dd & [111] .th & [111] .gy  AS TT from [111] Where [111] .hsm=5185

4.数字做为表名称的话要用中括号标识,
LZ先把语句写完整了,再看看结果

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-12-10 21:14 | 显示全部楼层
非常感谢Renco的提醒:
这第1句是我想达到的,可每次运行总是视同死机,没有反应。
所以我将第1拆成2句,先执行第3句,然后从第3句的结果中随便挑选了2个,执行第2句,这2句都是成功的。从而说明第1句也是没错啊。

select [111] .dd & [111] .th & [111] .gy  AS TT from [111] Where [111] .hsm=5185这句
只是达到了我的第3句的效果,至于写法不同,那是因为我的写法不正规,只要结果成功,也没仔细去考虑语法上的事情了,同样,数字表名要用中括号,我确实不知道,因为语句都能通过,我也不会提问了,那么也永远不会知道了,至于本题,我测试了,与[  ]无关,与别名as TT也无关。

再回到原题:已知5185, 找出5185所在行的记录当然方便,但我现在要找到5185这笔业务所在的整套业务(目的就是查帐),联系的桥梁我认为就是日期、套号、柜员号三者缺一不可。
比如没有日期,则相同套号、相同柜员号的业务可能在其它日期也有,但不一定存在5185业务。

TA的精华主题

TA的得分主题

发表于 2008-12-11 08:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
在SQL语句里要效率提高须避用一些语句使用,特别是大数据量的查询筛选时,其中之一就是In语法,
从LZ的目的来看,可以通过Distinct子查询作为关联表查询来完成,

Select [111].* From (Select Distinct dd,th,gy  from [111] where hsm=5185) AS T01 Left Join [111] on T01.dd=[111].dd and T01.th=[111].th and T01.gy=[111].gy

这句你试一下,具体里面的书写格式你再调试一下

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-12-12 18:06 | 显示全部楼层
非常感谢Renco 老师,按您最后一句,成功了。
另外,接受您的意见,将表名改为字母,这个Distinct也没放进去,正确。
太谢谢您了。

我在VBA中做了一个窗体。窗体包括二块内容:简单查询和复杂查询
简单查询有11个框,可以任意组合,可以有比较符,但每一框至多只能输入一项内容
复杂查询是用combobox做的,将平时可能要用到的各种各样的SQL语句样式加载到框内,要使用时只要选出并略作修改就可以。
我的窗体已经做的很大了,可这个SQL语句实在是长啊,可我在属性框里面就是找不出换行的方法,网上搜索后发现,居然有好多属性,我的电脑中是没有的(office2003).
这点已超出本贴主题了,大家是否有办法?若确实不行,关系也不大,毕竟是可以使用了。

TA的精华主题

TA的得分主题

发表于 2008-12-15 08:22 | 显示全部楼层
我对于查询呢,一般都采用如下图所示的查询条件对话框,图1中我是在ACCESS用的主子窗体,可以多条件及多条件组的进行查询,图2中VBE窗体,是由ACCESS改过来.一时间没用datagrid控件来代替子窗体,后来就用了6行控件来代替(想了想用到6个以上的基本没有,呵...)

ACCESS窗体

ACCESS窗体

VBE窗体

VBE窗体

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-12-15 17:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢,下面这个窗体,基本上可以包含大多数查询了,
但是,有些复杂的查询,我觉得还是需要直接用SQL
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-10 07:47 , Processed in 0.043013 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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