ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[Excel 程序开发] [第36期]万里挑一 (ADO) (已结)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-5-31 17:06 | 显示全部楼层 |阅读模式

貌似第一次出ADO相关的题目。

请将附件中两个文件解压到同一目录。


说明
原题目是两个表中各有10000行数据,b表中多了一个错误数据。
要从10000行数据中把这个错误的数据找出来,所以 较叫“万里挑一”
在此基础上增加了一些数据,但仍保留了原来的题目名称

base.mdb数据库中的a表是原始名单,b表是工厂运作一年后的名单
期间有老员工离职,并新招了新员工
现在总部需要对新员工重新考核。
请根据a表从b表中列出新员工名单显示在a列
a表及b表皆为无序排列,名单中无规律可循
a表及b表中皆无空值及重复值

答题标准:先单击“测试标准用时”按钮获取标准用时
1. ADO方法:
运行用时必须低于标准用时
结果必须与标准答案一致(顺序可以不同)
不得改变数据库结构
用一句SQL语句获取结果得2分(其他相关代码已写好,答题者只需编写SQL语句)
SQL语句长度小于100个(不含100个)字符加1分
SQL语句长度最短者额外加1分

2. 其他方法:(3分)
对ADO不熟悉的会员,可用其他方法答题
其他相关代码已写好,答题者只需编写运算及赋值语句
运行用时必须低于标准用时
结果必须与标准答案一致(顺序可以不同)
可使用任意方法(注:我用非ADO方法用时超标数十倍)
答案优秀者另外加分

答案请压缩后发送到 26258103@163.com  (请注明你在论坛的名字) 并跟贴占位,请勿在跟贴中直接发答案
只发EXCEL文件,数据库不用发。


修正了数据库内容,请在此之前下载的会员重新下载。---ldy 2008-5-31-17:38

strSQL = "b left join a on b.nm=a.nm where a.nm is null"         '45字符

补充说明: 此题出题是有个BUG。由于字典对象处理此类问题论坛中已有多个范例,在限制条件中忘记说明 禁止使用“字典对象”

这是我的疏忽,与答题者无关,用字典对象答题者依然可得分。另分值设定也超出了论坛限制(每题最高得分5分)。所以使用两种方法都答对的会员

最高得分为 5 分。

讲解部分:稍后另跟贴说明。

[此贴子已经被作者于2008-6-22 20:10:42编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2008-6-1 13:08 | 显示全部楼层

答案已发送,跟帖占位。

第一次玩,多关照。

 

顺便提一下,希望版主在程序模块中的注释

也能给出英文的,我的VBE显示不了中文。

谢谢。

 


两种方法都正确 +5 分

[此贴子已经被ldy于2008-6-22 17:26:50编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2008-6-1 23:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
<p>已经做好了!占位完毕 !</p><p>由于不熟悉ADO,所以使用其它方法来完成!目前本地测试,时间比标准时间少!</p><p>zldccmx&nbsp; 2008.6.1</p><p>&nbsp;</p><p>&nbsp;</p><br/><p><font style="BACKGROUND-COLOR: #00ffff;">两种方法都正确 +5 分</font></p>
[此贴子已经被ldy于2008-6-22 17:27:32编辑过]


[ 本帖最后由 willin2000 于 2008-11-15 20:17 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2008-6-4 08:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

跟贴占位,答案已发送.

不过ADO   100个字附以内完成我还真想不出来怎么做,

 

两种方法都正确 +5 分


[此贴子已经被ldy于2008-6-22 17:29:13编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2008-6-11 08:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

这是第一次答VBA题,由于水平差,马马虎虎做了一个,重在参与嘛,用时都比标准用时高N倍,其他方法也比ADO多了10倍,与版主正好相反,呵,得向你们好好学习了!

 


谢谢参与,两种方法都超时,不得分

[此贴子已经被ldy于2008-6-22 17:35:54编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2008-6-12 13:14 | 显示全部楼层

答案已压缩 发送到 26258103@163.com ,发帖占位

 

VBA方法  (字典)正确 +3 分

sorry  看错了 ADO VBA方法(字典)都正确 补+2 分

[此贴子已经被ldy于2008-6-23 13:38:33编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2008-6-12 17:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

答案已发送,请版主及时查看.

ADO用的不是太会,利用字典做了一个

 

 



VBA方法  (字典)正确 +3 分

[此贴子已经被ldy于2008-6-22 20:06:03编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2008-6-15 16:32 | 显示全部楼层

答案已发送,占个位。

 


两种方法都正确 +5 分

[此贴子已经被ldy于2008-6-22 17:40:57编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-6-22 19:56 | 显示全部楼层

不算总结的总结:得分者无一例外,都是用字典对象来答题的。

出题出了个大BUG ,类似题目用字典解决论坛中已有多个例子,我自己也给其他会员写过。

所以想当然地忽略了字典,忘记说明 限制使用字典。

呵呵给大家送分了。

遗憾的是么有看到 非ado 非字典的 高效处理方法。

_________________________________________________________________________________________

介绍一下ado方法 最短语句如下

strSQL = "b left join a on b.nm=a.nm where a.nm is null"

这道题从 strSQL = "select nm from b where nm in (select nm from a)" 取反向值而来。

这个语句运行正常。想当然的既然取反向值 加个 not 就行了

 strSQL = "select nm from b where nm not in (select nm from a)"

在编写测试代码时数据量不大,感觉不出问题,随着时间推移数据增加,这个语句运行起来就像死机一样。

这是我给客户编写的一个小程序中的BUG,好在圆满解决了,没让我陪钱。

我们接触的ado语句 90%与 select 语句有关,也就说绝大部分是基于表的操作。

一个select语句可以看作是一个表,同样一个表也可看作是一个 “select * from 表名” 语句

完整的语句应该是这样的(在a、b表都不止一列的情况下) :

str1 = "select * from ((select nm from b) as b left join (select nm from  a) as a on b.nm=a.nm) where a.nm is null"

这个语句可以这样理解 两个表(绿括号)按条件合并成一个新表,再从新表中安条件提取数据。

红色括号可以省略, left join ..... on 语句 被自动判断为一个 表(语句)并优先处理,在此之前 先处理两个绿括号中的语句。

语句中 as b 和 as a 不能省略,这里的b和a 可以把它当作变量来看, 指代绿括号中的表(语句),只是刚好用了本身的名称,

也可以改为 as c 和 as d  但后面的 on 语句 要相应的改为 c.nm=d.nm

题目中 a 和 b 表都只有一列 所以 select nm from a (或 b) 所返回的都是一个完整的表。

语句可以进一步简化

str2 =  "select * from (b left join a on b.nm=a.nm) where a.nm is null"

这个语句返回两个表(合并后新表)的所有列,共两列 ,红色括号中的语句可以看作一个表

一个select语句可以看作是一个表,同样一个表也可看作是一个 “select * from 表名” 语句

进一步简化

strSQL = "b left join a on b.nm=a.nm where a.nm is null"

但是 像上面的str1 就不能这样简化

str1 = "(select nm from b) as b left join (select nm from  a) as a on b.nm=a.nm where a.nm is null"

有关ado的内部运行机制,很难找到相关资料(估计网上是没有的),很多时候只能靠经验来处理了。

如果 a 表和 b表 都不止 一列 ,假设 a表有 30 列 b表有 50 列

strSQL = "b left join a on b.nm=a.nm where a.nm is null"

这个语句 将返回 80 列的 数据(表),如果只需要返回两列,则在前面增加 "select b.nm ,a.nm from " 语句

返回结果和str1 一样,但在效率上来说,str1要高的多

str1 = "select * from ((select nm from b) as b left join (select nm from  a) as a on b.nm=a.nm) where a.nm is null"

因为这个语句自始至终 都只返回两列。

所以最简的语句 就是一个表名

像这个语句:

Sheets("a").Range("a1").CopyFromRecordset cn.Execute("SELECT * FROM a")

可以直接简化为:

Sheets("a").Range("a1").CopyFromRecordset cn.Execute("a")

想表达的意思比较多(帮助文件里是没有的),看起来有点乱。包涵包涵。

希望会员看了此文能对ado的理解有所帮助。

TA的精华主题

TA的得分主题

发表于 2008-6-22 21:14 | 显示全部楼层

呵呵,我的ADO代码是59字符,strSQL = "select * from b left join a on b.nm=a.nm where a.nm is null"  不知道可以将select * from 省略掉,哈哈

通过这次竞赛,的确是双丰收哦!

既赚到了宝贵的分分,也学到了不少知识。之前,俺对ADO可是一窍不通哦。在版主的鼓励下,俺结结巴巴的磕磕碰碰的跌跌撞撞的摸着石头过河,终于完成了ADO语句的编写。

总之,除了感谢还是感谢!

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 22:15 , Processed in 0.041323 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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