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

LIKE の代わりに CONTAINS を次のように使用したい:

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結合で使用できないわけではありません。

列を 2 番目のパラメーターとして使用することはできません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 に答える
0

つまり、CONTAINS を使用してこれを行う方法はありません。単純に、このような JOIN では許可されていません。参照: TSQL - 全文 CONTAINS を使用した結合

したがって、パフォーマンスに影響はありますが、ここでは IMO like が最も簡単な解決策です。

于 2013-07-03T13:11:38.210 に答える