MS-SQL JOIN具有多个SUBSTRING和LIKE

时间:2014-01-21 09:44:50

标签: sql

我有一个MS SQL 2005/2008数据库,并尝试使用带有%wildcard的子字符串比较两个数据表,以尝试查找其他表中列的一个字符内的数据。

示例是:

UPDATE table1
SET table1.Marker = 1
FROM table1
INNER JOIN table2 
ON table1.ForeignKey = table2.ID
AND tabl1.CharacterColumn LIKE SUBSTRING(table2.CharacterColumn , 1, 5) + '%' + SUBSTRING(table2.CharacterColumn , 7, 8) 

UPDATE table1
SET table1.Marker = 1
FROM table1
INNER JOIN table2 
ON table1.ForeignKey = table2.ID
AND tabl1.CharacterColumn LIKE SUBSTRING(table2.CharacterColumn , 1, 6) + '%' + SUBSTRING(table2.CharacterColumn , 8, 8) 

目前运行此例程需要一段时间,因为该列最多可包含10个字符,数据集位于3亿个行的表1(但数据集可能为300k)和2个行的表2(数据集) 100k)。

我的问题是JOIN语句是在列上搜索一个字符的最佳方法吗?

我不能给出确切的例子,因为数据受到保护,但这应该有所帮助:

表2 -

ID | FK | Name  
1 | 100 | Phillips  
2 | 100 | Bloggs  
3 | 100 | Jones

表1 -

ID | Table2FK | Name 
1 | 100 | Philpips 
2 | 100 | Bloggs 
3 | 100 | Jones 

如您所见,table2记录1在table1记录1的一个字符内,我想识别它。此外,一个字符可以出现在字符串中的任何位置

1 个答案:

答案 0 :(得分:0)

在SQL函数中包装列时,SQL Server不再能够使用索引。如果您有像您所描述的大型表,SQL Server将需要执行许多CPU密集型操作,如索引扫描。你有2个选择

  1. 使用该子字符串的列创建索引视图。第一次构建它需要更长的时间,但之后您将能够轻松加入。

  2. 第二种方法是修改表以将字符列拆分为两个单独的列,并在这两列上创建索引。

  3. 字符串操作非常昂贵,最好能够将字符串拆分为单独的列,而不是实时执行。

    索引视图文档http://technet.microsoft.com/en-us/library/dd171921(v=sql.100).aspx