2013-07-03 56 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似乎是最簡單的解決方案。