关于Access的左连接
这篇随笔没有什么深奥的技术要讨论,只是自己一个知识上的盲点:不知道在Access中如何进行左连接的操作。通过在网上搜索,最后在CSDN上找到了自己要的答案,因此觉得有必要记录下来:)
最近做项目,要将一个Access中的数据导入到Oracle中。刚开始我以为用SQL-Server的导入导出工具就可以轻松搞定的,随后才发现有的字段信息不是直接导入过来就ok的,于是又只好自己敲个程序来搞定了。
先把问题列出来:如下图所示,一目了然,无需其他废话了。
所以一并在这里将Oracle的左连接的操作也写一下,算是小小的总结吧,Oracle的左连接SQL语句如下:
Access的左连接SQL语句如下:
问题是很容易就解决了,可是新的疑问又来了,这两种不同的用法分别都支持什么数据库呢?他们之间性能有什么优劣之分么?于是又开始上网狂找了一通,大致理出来了自己的一点想法,也可能不对,还请各位指点则个!
有部分内容是从网上抓下来的,可是没有找到出处,致敬先!
一、关于外连接(Outer Join)
SQL-92标准(SQL 标准的正式名称是ISO/IEC 9705 "Database Language SQL"。最近的一个版本被称作ISO/IEC 9075:2003或简称为SQL:2003。这个版本之前的是SQL:1999 和SQL-92。有兴趣的可以去这里SQL Standards看看不同的标准以及它们之间的差异)所定义的FROM子句的连接语法格式为:
FROM join_table join_type join_table [ON (join_condition)]点击下载SQL92StandardJoinSyntax.pdf
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多个表操作,对同一个表操作的连接又称做自连接。join_type 指出连接类型,可分为三种:内连接(Inner Join)、外连接(Outer Join)和交叉连接(Cross Join)。
对于外连接,MS SQL-Server支持两种形式:
1、从Sybase继承来的形式
字段1 *= 字段2 (左连接)
字段1 =* 字段2 (右连接)
这种形式没有全外连接方式
2、标准的外连接语法
left [outer] join on EXPRESSION
right [outer] join on EXPRESSION
full [outer] join on EXPRESSION
而对Oracle来说,在8i的时候,Oracle的外连接方式只有两种:即左/右连接,到了9i以后,Oracle也支持了标准的外连接语法,因而它也是两种方式
1、字段1=字段2(+) (左连接)
字段1(+) = 字段2 (右连接)
这种形式也没有全外连接方式
2、标准的外连接语法
left [outer] join on EXPRESSION
right [outer] join on EXPRESSION
full [outer] join on EXPRESSION
这里只对MS SQL Server和Oracle进行了比较,对于其他的一些数据库如MySQL , PostgreSQL等就没有一一列出了。
二、关于Join操作的可能优化方法
我觉得所谓的优化,还是一个见仁见智的问题,需要根据实际的情况来进行定夺。由于自己的经验很少,只能浅浅的说一些很常见的可以优化的地方,如果理解有误,就请大家多多指点^_^
1、对于要经常进行Join操作的多个表(尤其是数据量比较大的表),在其join操作的字段上每个表都应当建立索引;
2、在SELECT后面不要直接就一个SELECT *,而只要SELECT你需要用到的Columns就够了;
3、对于要进行join操作的表的字段应该是那种unique值居多的字段为好;
写到这儿的时候,自己真的是想不到其他的了,于是又去网上搜索了一下关于join performance的文章,结果真找到了一篇比较好的文章(不过是English Version),我的很多想法文章里面都包括了,文章主要是讲的MS SQL Server中join performance的问题,但我觉得还是有普遍意义的。
大家可以到这儿看看http://www.sql-server-performance.com/tuning_joins.asp
如果打开网页慢的话,也可以点击下载JoinPerformance.pdf