17xie > SQL Server 2005高级程序设计 > 2.5 替代的联结语法
背景:                 
[本书目录] [图书首页] [本书讨论区]  
链接地址:http://www.17xie.com/read-105381.html    注册17xie 一起来写书 实现您的出书梦想!

2.5  替代的联结语法

很多人依然认为本节中要讨论的内容是编写联结代码的“正规”(normal)方法。直到SQL Server 6.5,这里要讨论的可选语法都一直是SQL Server中唯一的联结语法,而如今认为的编写联结代码的“标准”(standard)方法甚至连选项都不是。

直到现在,我们所有的SQL语句一直在使用ANSI语法。由于ANSI方法在系统间有更好的移植性,同时,也具有更佳的可读性,因此我非常推荐使用ANSI方法。值得注意的是,旧式的语法现在仍然在平台间得到很好的支持,尽管ANSI语法也被所有主要的平台支持。

在这里涵盖旧式语法的主要原因是:你迟早会在遗留代码中遭遇到旧式语法,这一点毫无疑问。我可不希望你瞪着这些代码说,“这到底是什么啊?”我反复重申,强烈推荐你在任何可能的地方使用ANSI语法。另外,它实际上更易读,微软不明确地表示过可能将不再支持旧式的语法。面对众多的遗留代码,很难相信微软近期会抛弃旧式的语法,但这也没准。

或许最重要的原因是ANSI语法更实用。事实上,在旧式的语法下,很容易产生模糊的查询逻辑——有不止一种方式解释查询。新的语法消除了这种问题。

还记得在本章的前面把JOIN与WHERE子句相比较吗?这样做是有原因的。旧式的语法把所有的JOIN表达在WHERE子句中。

旧式的语法支持除了FULL JOIN外所有使用ANSI能完成的联结。如果需要执行FULL JOIN,恐怕必须使用ANSI版本。

2.5.1  替代的INNER JOIN

回顾一下本章中所做的第一个INNER JOIN:

下面不使用ANSI的JOIN,而是用基于WHERE子句的联结语法重写查询。这实际上很容易——只需要去除单词INNER JOIN,再加入一个逗号,然后把ON操作符替换为WHERE子句:

的确很简单,该查询返回的行与使用另一种语法的查询一样。

当今世界上,几乎所有主要的SQL系统(Oracle、DB2、MySQL等)都支持该语法。

2.5.2  替代的OUTER JOIN

在SQL Server 2005中,没有必要让替代的OUTER JOIN语法可用。实际上,现在该语法默认是关掉的——必须将数据库兼容级别设置为80或者更低(80是SQL Server 2000)。太好了,这里只有非常少的代码使用这种语法。

既然现在不赞成使用该语法,就不去详细讲述它了,要做的基本工作与INNER JOIN非常相似,除了由于没有LEFT或RIGHT关键字(就这点来说,也没有OUTER或JOIN),需要特别为该任务创建一些专用的运算符。这些运算符如下所示:

回顾本章所执行的第一个OUTER JOIN,它使用了pubs数据库,类似下面这样:

同样,这里去掉单词LEFT OUTER JOIN,然后用一个WHERE子句替换ON操作符:

默认情况下,外联结的替代语法不可用。若要使用这一功能,必须把兼容模式设置为80或更低。

2.5.3  替代的CROSS JOIN

这无疑是最简单的。要用旧式的语法创建CROSS JOIN,几乎什么都不必做。即是说,不需要在WHERE子句中加入下面这种格式的东西:TableA.ColumnA = TableB.ColumnA。

此处取用本章前面CROSS JOIN节中的第一个例子作为一个极其简单的例子。ANSI语法如下:

要将其转换成旧式的语法,只需去除CROSS JOIN关键字并加入一个逗号:

就像本节中的其他例子一样,此处的查询返回与ANSI语法一样的结果。

下面,返回到大多数数据库管理系统的支持中。


字数:1546    最后更新:7个月以前 [04-23 15:30]happyskynet 修改
本页编辑者:happyskynet  
[前一页]:2.4 DELETE语句  [后一页]:2.6 UNION
[在本页中加入书签] [收藏本书] [推荐本书]
  17xie论坛 > 本书讨论区 > 本页评论   (共0条)
发表评论

用户名称 匿名发表
评论内容
验证码

关于我们 | 版权声明 | 免责声明 | 诚聘英才 | 联系我们 | 合作伙伴 | 友情链接 | 广告合作 | 提交意见
Copyright © 2007 17xie.com 互联网协同写书平台 京ICP备08002671号