第一部分
两个表字段类型一样时:
LOGISTICS:
LOGISTICS_SON:
此时进行两个表的inner join
SELECT * FROM LOGISTICS l
inner join LOGISTICS_SON s on s.transorder=l.transorder
第二部分
现在将LOGISTICS表的transorder改成varchar类型:
再执行查询:
这是一个性能的损耗。
但是呢,利用它的这个“特性”,可以做点鸡贼的事(虽然一般用不上,看你的数据库是不是自作聪明地将原本应该“哈希匹配”的,做成了“嵌套循环”了)。
比如当两个表的数据类型相同的时候(如第一部分)
使用这种强制改变执行计划的语句,会报错:
然而,利用字段类型不同,sql server会执行“计算标量”的特性(此时数据表改回第二部分):
此时能够执行成功,原因是在hash join之前,列已经是“计算标量”了。
注意,此时必须是 l.transorder='XXX' ,而不能是 s.transorder='XXX' 。