ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 去妄存真——学习SQL的三把破妄之剑

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2010-4-23 09:22 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:SQL应用
用肉眼观察,1组和2组这两个工作表的格式是一样的,列数也一样,但是,实际的情况是什么呢?
我们先用SQL语句(参考动画:出错提示.GIF):
select * from [`1组`]
UNION ALL
select * from [`2组`]
发现,SQL提示"列数不匹配".列数不匹配,说明两表的字段数不同.这是什么原因呢,肉眼上看,两表的列数(即字段数)是一致的啊.下面我们用三把宝剑来分析一下数据.

第一把宝剑:文本文档或记事本(参考动画:记事本OR文本文档.GIF):
我们用文本文档查看一下.分别点击两个工作表的第一行-选择第一行记录-复制-粘贴到文本文档中;
选中字段之间的空格,执行-查找替换-替换为",";然后,文本就出现:
员 工,"
职位",小组., 目 标 产 量 ,1月1日,1月2日,1月剩余量,,,,,,,,,,
员 工,"
职位",小组., 目 标 产 量 ,1月1日,1月2日,1月剩余量
从上面我们观测到,[职位]变成["
职位"],而[目 标 产 量]变成[ 目 标 产 量 ],而且,1组后面还多出一排",".
呵呵,这个就是文本文档观测到的真实面貌.
[职位]变成["
职位"]:是由于我在数据源中,在[职位]插入了强制换行符.于是,文本文档就告诉我们,[职位]存在强制换行符.至于"
"就是强制换行号在名称中的位置.
[目 标 产 量]变成[ 目 标 产 量 ]:是由于数据源中的真实名称是[ 目 标 产 量 ],而将数据居中处理,这样肉眼看起来是没有前后空格的.
1组后面还多出一排",":这个是因为1组后面存在多个假空列.

找到原因了,我们就可以为上面的连接找到解决方法:
方法1:删除假空列,并保存工作簿,再使用上面的SQL语句
方法2:精确区域,排除假空列.将上面的SQL语句更改为:
select * from [1组$A:G]
UNION ALL
select * from [2组$A:G]

小结:利用文本文档或记事本,可以为我们快速提取字段名称,和识别假空列和部分特殊字符.

第二把宝剑:利用外部数据源直接生成表(参考动画:外部数据源.GIF和留意出错提示和修改过程.GIF).(这个我最常用,强烈推荐)
选中任意一单元格-执行数据-导入外部数据-导入数据-选择你要查看的表-新建工作表-确定.
这是,我们看到利用这种方法创建的表,与文本文档的不一样.
员 工,_职位,小组#, 目 标 产 量 ,F5,F6,1月剩余量,F8,F9,F10,F11,F12,F13,F14,F15,F16,F17
员 工,_职位,小组#, 目 标 产 量 ,F5,F6,1月剩余量
其中,一组的[职位]变成_职位,[目 标 产 量]肉眼上看并没有变化,但利用文本文档的方法提取字段名称时,我们发现,依然是有前后空格的.[小组.]中的"."被"#"代替,日期则用F5、F6代替.而假空列也是用Fx的形式代替.
呵呵,这个就是SQL观测到真实面貌.
[职位]变成_职位:这是由于在SQL中,"_"表示强制换行符号.
[小组.]变成小组#:个人认为,这是由于"."在SQL中常用于表示字段和表之间的关系符号(不知道这样表述是否正确).为避免混淆,所以以"#"代替;也可以理解成在SQL中,字段尾是"."时,以"#"代替.
日期用Fx代替:在SQL中,字段名称是日期型,可以用Fx的形式,其中X为该字段在表中的位置.
假空列同样是用Fx代替.

不过,假如我们想不用*,而是想提取具体字段时发现SQL又出错了.
在解释前,先说明一下,字段的表示SQL可以使用两种格式.一种是"[]",如SELECT [员 工] FROM [`1组`];一种是"``",如SELECT `员 工` FROM [`1组`],"[]、``"一般可以忽略。
但当字段含空格或特殊意思值或以数字为开头等时,"[]、``"不能省略.

找到原因后,我们又可以用另外一种解法:
select [员 工],[_职位],[小组#],[ 目 标 产 量 ],F5,F6,[1月剩余量] from ['1组$']
UNION ALL
select [员 工],[_职位],[小组#],[ 目 标 产 量 ],F5,F6,[1月剩余量] from ['2组$']

小结,利用外部数据源法,可以直接获得字段在SQL的正确写法,当遇到含特殊字符的字段名称,可以用此法获得正确的表述.结合文本文档,更是如虎添翼.

第三把宝剑:利用Microsoft Query(简称MQ)(参考动画:MQ.GIF)
这种方法跟第二种的原理差不多,不再罗嗦.
出错提示.gif
记事本OR文本文档.gif
外部数据源.gif
留意出错提示和修改过程.gif
解法2.gif
MQ.gif

示范.rar

11.2 KB, 下载次数: 694

评分

4

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-4-23 09:25 | 显示全部楼层
将文本文档粘贴到论坛,发现小黑框也变回了强制换行。
附件示范,包括数据源及用WORD和文本文档的说明。内容是一样的。

TA的精华主题

TA的得分主题

发表于 2010-4-23 09:34 | 显示全部楼层
先在这占个位学习,很需要学习SQL。

TA的精华主题

TA的得分主题

发表于 2010-4-23 09:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
留下足跡,謝謝樓主提供分享 !!!

TA的精华主题

TA的得分主题

发表于 2010-4-23 09:52 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-4-23 09:57 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-4-23 10:40 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-4-26 21:09 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-4-27 16:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
SQL+Excel还是比较高级的,学习了!

TA的精华主题

TA的得分主题

发表于 2010-4-28 22:40 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-29 02:17 , Processed in 0.054754 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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