使用带CONTAINS函数的JOIN语句

时间:2013-07-03 12:40:20

标签: sql-server join contains sql-like

在SQL Server数据库中,我有一个包含大量INNER JOIN语句的View。最后一个连接使用LIKE谓词,这就是为什么它的工作太慢了。查询如下所示:

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  + '%'

我想使用CONTAINS而不是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)

我知道CONTAINS比LIKE工作得更快,而且在JOIN语句中也不能使用CONTAINS。 在这个案例或建议中是否有任何解决方法? 提前谢谢。

4 个答案:

答案 0 :(得分:4)

并不是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

答案 1 :(得分:0)

简而言之,没有办法使用CONTAINS这样做,只是在这样的JOIN中是不允许的。 见:TSQL - A join using full-text CONTAINS

因此虽然性能受到影响,但IMO是最简单的解决方案。

答案 2 :(得分:0)

您可以使用LIKE创建联接。 像这样的东西:

SELECT * FROM TABLE_ONE FULL OUTER JOIN TABLE_TWO ON TABLE_ONE.String_Column LIKE '%' + TABLE_TWO.Name + '%'

ie-从TABLE_ONE中选择所有内容,其中TABLE_TWO名称中包含string_column

答案 3 :(得分:0)

CONCAT完美运行,我已经在PostgreSQL上进行了测试

选择* 从TABLE_ONE作为内部联接TABLE_TWO作为b ON b.field like CONCAT('%',CONCAT(a.field,'%'));

请参阅类似的答案here