3.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版本。
3.5.1 替代的INNER JOIN
回顾一下本章中所做的第一个INNER JOIN:
![]()
下面不使用ANSI的JOIN,而是用基于WHERE子句的联结语法重写查询。这实际上很容易——只需要去除单词INNER JOIN,再加入一个逗号,然后把ON操作符替换为WHERE子句:
![]()
的确很简单,该查询返回的行与使用另一种语法的查询一样。
当今世界上,几乎所有主要的SQL系统(Oracle、DB2、MySQL等)都支持该语法。
3.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或更低。
3.5.3 替代的CROSS JOIN
这无疑是最简单的。要用旧式的语法创建CROSS JOIN,几乎什么都不必做。即是说,不需要在WHERE子句中加入下面这种格式的东西:TableA.ColumnA = TableB.ColumnA。
此处取用本章前面CROSS JOIN节中的第一个例子作为一个极其简单的例子。ANSI语法如下:
![]()
要将其转换成旧式的语法,只需去除CROSS JOIN关键字并加入一个逗号:
![]()
就像本节中的其他例子一样,此处的查询返回与ANSI语法一样的结果。
下面,返回到大多数数据库管理系统的支持中。






