【Access小品】两个联接问题的处理-煮江品茶
Access软件网QQ交流学习群(群号码198465573),欢迎您的加入!
首页 >技术文章> Access数据库-教程


【Access小品】两个联接问题的处理

发表时间:2015/7/28 17:33:33 评论(0) 浏览(6257)  评论 | 加入收藏 | 复制
   
摘 要:【Access小品】两个联接问题的处理
正 文:
  前日里为一版友解决中位数问题,曾写《入乡随俗》一文,在该文中对中位数采用自定义函数方式处理。这种方法存在一个问题,就是当Access做后台时,其中的查询如果调用自定义函数的话,那么数据是无法在前台读出来的。究其原因大概是Access不像SQL SERVER可以提供数据库服务,它不能自动运行后台的程序和自定义函数。由于这样的一个原因,就需要采用SQL语句来直接编写后台的查询,以便前台的调用。

  中位数是指一组数据由小到大排序后,如果记录条数为奇数则取其中间位置的数据,如果为偶数则取中间两数的平均数。编写中位数查询还是有一些难度的,其难度有二:其一是如何统一记录条数为奇数和偶数的算法,也就是一个算式要同时满足两种情况的运算;其二是如何进行高效率的运算。

  为了简化中位数查询的SQL语句,我们可以先编写一个“编号查询”。这个查询中我们解决两个问题,其一是对记录按照分组编出序号;其二是我们设计两个中位数位置。如果记录条数为偶数,比如6条记录,那么有两个中位数分别处于3和4。问题在于当记录条数为奇数时,比如7条记录,中位数处于4,只有一个中位数位置。为了统一中位数算法,我们可以将奇数条数的中位数也看成有两个,也就是两条处于4位置的记录。这样的话,我们就都可以用两条记录的平均数来计算中位数了。为了求出位置一,我们利用了Access中逻辑值的特性(0,-1),这是一个常用的奇巧的算法。由此我们为解决中位数计算的第一个难题做好了准备。

  关于第二个难题是计算效率问题,中位数的处理我们可以有多种方法。其中比较容易想到的是在字段上编写子查询或用域函数,但这样的处理运算速度非常慢。比较好的处理时采用联接的方式编写。由此我们可以编写“中位数查询”,在这个查询中,我们用一个分组查询与两个“编号查询”联接,这样就得到了计算中位数的两个值,将这两个值平均一下,也就得到了对应的中位数了。


  另外一个关于联接的问题也有点意思。有一个版友给了这样一组数据:

县市           乡镇
衡阳县        湖南张家界市
临湘市        湖南省岳阳地区岳阳市
湘潭县        湖南衡阳县西渡镇
岳阳市        中国湖南湘潭县易俗河镇

  其希望处理后得到如下结果:

县市           乡镇
岳阳市        湖南省岳阳地区岳阳市
衡阳县        湖南衡阳县西渡镇
湘潭县        中国湖南湘潭县易俗河镇

  这个问题看起来复杂,其实如果用联接的方式处理也十分简单,这个查询中的关键部分在于ON子句的写法,这个写法采用的是逻辑表达式,而不是关系表达式。关于这个问题,可以参见《三层功夫》中的论述。


示例:点击下载此附件


视图:


Access软件网交流QQ群(群号:198465573)
 
 相关文章
何时使用导入或联接  【UMVSoft整理  2009/4/27】
SQL加速|升迁至SQLServer数据库后,如果存在左联接或者右...  【金宇  2014/4/15】
【Access小品】三层功夫--两表联接的特殊处理  【煮江品茶  2015/4/28】
通过视图解决当后台为SQL,客户端使用左右联接导致查询速度很慢。  【易勋  2015/7/2】
【Access小品】入乡随俗--中位数函数示例  【煮江品茶  2015/7/24】
常见问答
技术分类
相关资源
文章搜索
关于作者

煮江品茶

文章分类

文章存档

友情链接