2013-07-03 55 views
2

在SQL Server数据库中,我有一个包含大量INNER JOINs语句的View。最后的连接使用LIKE谓词,这就是为什么它的工作速度太慢。查询看起来像:在CONTAINS函数中使用JOIN语句

SELECT * 
FROM A INNER JOIN 
B ON A.ID = B.ID INNER JOIN 
C ON C.ID1 = B.ID1 INNER JOIN 
........................... 
X ON X.Name LIKE '%' + W.Name + '%' AND 
      LIKE '%' + W.Name2 + '%' AND 
      LIKE '%' + W.Name3 + '%' 

我想用含有代替LIKE为:

SELECT * 
FROM A INNER JOIN 
B ON A.ID = B.ID INNER JOIN 
C ON C.ID1 = B.ID1 INNER JOIN 
........................... 
X ON CONTAINS(X.Name, W.Name) AND 
    CONTAINS(X.Name, W.Name2) AND 
    CONTAINS(X.Name, W.Name3) 

我知道包含工作比LIKE速度更快,也不能使用含有In JOIN声明。 在这种情况下或建议是否有任何解决方法? 在此先感谢。

回答

1

这不是CONTAINS不能用于连接。

你就不能使用的列作为CONTAINS第二个参数 - 见MSDN - CONTAINS (Transact-SQL)

CONTAINS 
({ column_name | (column_list) | * } 
    ,'<contains_search_condition>'  
[ , LANGUAGE language_term ] 
) 

但是,您可以使用一个变量作为搜索条件,所以你可以使用一个光标,然后获取所有数据你需要。 下面是一些非常粗略的例子:

declare @Name nvarchar(max) 

declare @Temp_A table(Name nvarchar(max)) 
declare @Temp_B table(Name nvarchar(max)) 

--============================================================================================= 
insert into @Temp_A (Name) 
select 'Test' 

insert into @Temp_B (Name) 
select 'aaaTestaaa' 

--============================================================================================= 
-- Query 1 - LIKE 
--============================================================================================= 
select * 
from @Temp_A as A 
    inner join @Temp_B as B on B.Name like '%' + A.Name + '%' 

--============================================================================================= 
-- Query 2 - CONTAINS 
--============================================================================================= 
declare table_cursor cursor local fast_forward for 
    select distinct Name from @Temp_A 
open table_cursor 
while 1 = 1 
begin 
    fetch table_cursor into @Name 
    if @@fetch_status <> 0 break 

    select * from @Temp_B where contains(Name, @Name) 
end 
close table_cursor 
deallocate table_cursor 
+0

感谢您的答复。我对光标不熟悉。请给我一个例子,如何在我的情况下使用它? – Alexander

+0

增加了一些例子(虽然非常接近) –

0

总之,没有办法使用CONTAINS来做到这一点,它只是不允许在这样的JOIN中进行。 请参阅:TSQL - A join using full-text CONTAINS

因此,虽然有性能问题,但IMO似乎是最简单的解决方案。