如何用SQL Server JOIN加快范围查找

    对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)栏编写索引并提高性能,因为优化器能够利用这些索引,从而迅速找到相应的行。