对SQL开发者而言,JION是一个基本的组件,然而了解它们的真正作用的开发者却相对较少。许多开发者了解相等连接(equi-JOIN),它将表T1中的一个值与表T2中的一个值进行比较,就像这样:
SELECT * FROM T1 INNER JOIN T2 ON T1
这种SQL Sever开发只是JOIN应用的开始。首先你要意识到你可以用其它运算符来代替上面的等号。在多情况下,这没有多大用处,但你可以用<>替代等号(=),将T1中的一行与并不与T1中的值匹配的T2中的所有行连接起来。
范围查找是JOIN的一个更加有趣且实用的用法。在数千种业务流程,如税表、运输价格、学生成绩和保险费率中,范围查找都是最基本的应用。
不可能在查找表中发现任何给定的值,是这些情况下的根本理念。相反,查找表包含两栏:一栏中范围的最小基数(Floor),一栏是范围的最大基数(Ceiling)。列表A包含建立样本表的一个脚本。表1和表2中是样本行。
表1
RangeID |
Floor |
Ceiling |
Rate |
1 |
0.00 |
1.99 |
5.0000 |
2 |
2.0 |
3.99 |
8.5000 |
3 |
4.0 |
6.99 |
11.0000 |
4 |
7.0 |
9.99 |
13.0000 |
NULL |
NULL |
NULL` |
NULL | |
表2
ShipmentID |
Weight |
1 |
1.30 |
2 |
2.70 |
3 |
3.00 |
4 |
1.90 |
5 |
2.40 |
6 |
3.30 |
7 |
4.70 |
NULL |
NULL | |
SQL要求对列表B中的数据执行查询,于是得到如图3所见的结果集。查询得到了你希望的结果。如上所述,这是一个直接SELECT查询,但你可以根据自己的需要,轻易地把它变成一个存储过程或一个参数化UDF。
ShipmentID |
Weight |
Floor |
Ceiling |
Rate |
1 |
1.30 |
0.00 |
1.99 |
5.00 |
4 |
1.90 |
0.00 |
1.99 |
5.00 |
2 |
2.70 |
2.00 |
3.99 |
8.50 |
3 |
3.00 |
2.00 |
3.99 |
8.50 |
5 |
2.40 |
2.00 |
3.99 |
8.50 |
6 |
3.30 |
2.00 |
3.99 |
8.50 |
7 |
4.70 |
4.00 |
6.99 |
11.00 | |
这种方法有无数的应用,而且它比用WHERE谓语编写相应的SQL代码要容易得多。另外,在一个计算所得税范围的大型查找表中,你可以对最小基数(Floor)和最大基数(Ceiling)栏编写索引并提高性能,因为优化器能够利用这些索引,从而迅速找到相应的行。