8

在 SQL Server 数据库中,我有一个包含很多 INNER JOIN 语句的视图。最后一个连接使用 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

4 回答 4

6

并不是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
于 2013-07-03T13:11:47.510 回答
3

CONCAT 完美运行,我用 PostgreSQL 测试过

SELECT * FROM TABLE_ONE AS a INNER JOIN TABLE_TWO AS b ON b.field LIKE CONCAT('%', CONCAT(a.field, '%'));

请在此处参考类似的答案

于 2020-12-13T21:22:12.663 回答
3

您可以使用 LIKE.. 来创建连接,如下所示:

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

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

于 2018-11-30T10:50:11.780 回答
0

简而言之,没有办法使用 CONTAINS 来做到这一点,在这样的 JOIN 中根本不允许这样做。请参阅:TSQL - 使用全文 CONTAINS 的连接

因此,尽管性能受到影响,但 IMO like 是这里最简单的解决方案。

于 2013-07-03T13:11:38.210 回答