0

例如,我有 2 个表,例如:

表格1:

Column1
0001
0002
000a

表2:

Column2
0001
0002
000a

Column1 和 Column2 的数据类型都是 varchar(10)。我必须将 2 个表连接在一起,所以我的查询应该是

Select * from Table1 join Table2 on Table1.Column1 = Table2.Column2

但是,正如我们所知,以 varchar 类型连接 2 表比以数字类型连接 2 表要慢得多(我的表有数百万行)。我想试试

Select * from Table1 join Table2 on Cast(Table1.Column1 as int) = 
Cast(Table2.Column2 as int)

通常,它工作正常且速度更快。但是如果我在第 3 行 (000a) 中遇到异常,我的查询将被破坏。所以,我想找到一个像这样的查询:

Select * from Table1 join Table2 on
try
    Cast(Table1.Column1 as int) = Cast(Table2.Column2 as int)
catch if exception then
    Table1.Column1 = Table2.Column2

更新: - - - - - - - - - - - - - - - - - - - - - - - - ----------------------------------

我有一个理想:

首先,使用 try_cast 选择任何数字数据行:

select * from Table1 t1
join Table2 t2 
on try_cast(t1.Column1 as bigint) =try_cast(t2.Column2 as bigint)

之后,选择如果 try_cast 将变为 null 的任何行(异常行):

select * from 
(select * from Table1 t1 where try_cast(t1.Column1 as bigint) is NULL and 
t1.Column1 is not NULL) as table1
join
(select * from Table2 t2 where try_cast(t2.Column2 as bigint) is NULL and 
t2.Column2 is not NULL) as table2
on table1.Column1=table2.Column2

最后将所有 2 个结果结合在一起,我会得到我想要的。我参加了一个测试,它非常快。我的理想有什么问题或者我忘记了什么,请告诉我!

4

1 回答 1

0

如果您想使用整数连接,在某些情况下有快速的方法,但您必须知道您的数据:将您的值转换为数字。获取数字的想法是这样的:

SELECT Column1,
   ASCII(SUBSTRING(c1, 1, 1)) * 256 * 256 * 256
 + ASCII(SUBSTRING(c1, 2, 1)) * 256 * 256
 + ASCII(SUBSTRING(c1, 3, 1)) * 256 
 + ASCII(SUBSTRING(c1, 4, 1)) AS Column1Num
FROM Table1

结果:

Column1    Column1Num
---------- -----------
0001       808464433
0002       808464434
000a       808464481

这与您的示例保持一致,即所有值的长度均为 4 个字符。关键是找到为每个唯一值创建唯一编号并且仍然适用于所有记录的表达式。然后将此表达式用作您的JOIN.

  • 如果不是所有值都具有相同的长度,您可以补偿它(例如通过SPACE()函数)
  • 如果您的数字实际上是十六进制(0123456789abcdef),您可以在应用商之前将每个数字转换为值 0..15 之后将商从 减少25616
  • 这只是为了向您展示替代方法- 了解您的数据可以向您展示最佳计算公式,但也可以表明不可能进行此类计算

主要提示:评估所有方法的性能([1]加入 varchars,[2]来自您的问题更新的方法,[3]此答案中建议的方法)并选择最快的

于 2013-08-16T21:52:41.777 回答