2008-08-21 13 views
10

Can /ストアドプロシージャ/クエリを作成するときにINNER JOINの一部としてLIKE条件を使用する必要がありますか?私は正しいことを尋ねているかどうか分からないので、説明しましょう。INNER JOINの一部にLIKE句を使用する

テキストを含む列で検索するキーワードのリストを取得するプロシージャを作成しています。私は、コンソールの前に座っていた場合、私はそのように実行したい:

SELECT Id, Name, Description 
    FROM dbo.Card 
WHERE Description LIKE '%warrior%' 
     OR 
     Description LIKE '%fiend%' 
     OR 
     Description LIKE '%damage%' 

しかし、ストアドプロシージャに「強く型付けされた」リストの解析を行うために行っている間、私は少しを拾ったトリックは、リストを解析することですテーブル変数/テンポラリテーブルに変換し、適切なタイプに変換してから、最終結果セットのテーブルに対してINNER JOINを実行します。これは、整数IDのリストをプロシージャに送信するときに効果的です。

SELECT Id, Name, Description 
    FROM dbo.Card 
     INNER JOIN @tblExclusiveCard ON dbo.Card.Id = @tblExclusiveCard.CardId 

私はこのトリックを文字列のリストで使いたいと思っています。しかし、私は特定のキーワードを探しているので、LIKE句を使用します。だから、理想的に私はこのように私の最後のクエリを見ているだろうと思っています:

SELECT Id, Name, Description 
    FROM dbo.Card 
     INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + @tblKeyword.Value + '%' 

が推奨/このことは可能ですか?

このようなことをするより良い方法はありますか? 「archfiend」、「獣戦士」で使用されている「直接被害」と「戦闘ダメージ」という用語があるので、私は句の両端にワイルドカードを入れている理由がある


カードのテキスト。

パフォーマンスによっては、指定したクエリを使用することも、フルテキストキーワード検索を使用して同じタスクを実行することもできます。

私はテキスト検索をしたいフィールドにテキストインデックスを設定する以外に、何か必要なことはありますか?

答えて

4

最初のクエリは機能しますが、その列のインデックスは無視されるため、完全なテーブルスキャンが必要になります。また、すべてのLIKE句を生成するために、いくつかの動的SQLを実行する必要があります。

SQL Serverを使用している場合は全文検索を、Luceneの実装の1つをチェックしてみてください。ジョエルは最近彼の成功について話しました。

1

フルテキスト検索を探しているようです。あなたはカードの説明に対してキーワードのセットを照会してヒットを見つけたいので、正しい?

1

個人的には前にやっていて、うまくいきました。私が見ることができる唯一の問題はおそらくインデクスのないカラムの問題ですが、私はあなたがwhere句で同じ問題があると思います。

私のアドバイスは、2つの実行計画を見てみることです。状況に応じてどちらが優れているかは、すべての良いプログラミング問題と同じように異なると確信しています。

0

パフォーマンスは、使用する実際のサーバー、データのスキーマ、およびデータの量によって異なります。 MS SQL Serverの現在のバージョンでは、そのクエリはうまく動くはずです(MS SQL Server 7.0にはその構文の問題がありましたが、it was addressed in SP2)。

プロファイラでコードを実行しましたか?パフォーマンスが十分速く、データに適切なインデックスが設定されている場合は、すべての設定が必要です。

0

LIKE '%fiend%'はシークを使用しませんが、LIKE 'fiend%'は使用されません。ワイルドカードによる検索は可能ではありません。

1

@ Dillie-O
このテーブルの大きさはどれくらいですか?
[説明]フィールドのデータタイプは何ですか?

いずれか小さい場合は全文検索が過剰です。

答え、あなたが探してが、私は、スキーマの変更を提唱うではないかもしれない
Dillie-O @ ...

提案スキーマ:

create table name(
    nameID identity/int 
    ,name varchar(50)) 

create table description(
    descID identity/int 
    ,desc varchar(50)) --something reasonable and to make the most of it alwase lower case your values 

create table nameDescJunc(
    nameID int 
    ,descID int) 

これはあなたが持つことなく、インデックスのを使用できるようになりますソリューションにボルトを実装し、データをアトミックに保ちます。 Recommended SQL database design for tags or tagging

1

に「強く型付けされた」リストの解析を行うために を行っている間、私は、ストアドプロシージャは、テーブル変数に リストを解析することです少し拾ったトリック/一時的 表:関連

は、私はあなたがここにほのめかしかもしれないが、その後の試合を(言葉を除外するためにも、別のテーブルを使用することができます)を見つけるために relational divisionを使用して、テーブルに含まれるようにキーワードを入れていると思います。 SQLの作業例については、 Keyword Searches by Joe Celkoを参照してください。

0

これを試してください。

SELECT Id, Name, Description 
FROM dbo.Card 
INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + 
           CONCAT(CONCAT('%',@tblKeyword.Value),'%') + '%' 
3

この練習は理想的ではありません。この

select * from Table_1 a 
    left join Table_2 b on b.type LIKE '%' + a.type + '%' 

を試してみてください。慎重に使用してください。 。

+2

:-)私の作品: //stackoverflow.com/a/23276513/443900 – Lee

0

それを試してみてください...

select * from table11 a inner join table2 b on b.id like (select '%'+a.id+'%') where a.city='abc'. 

その私は、これは `CONCAT( '%'、a.type、 '%')` HTTPすべきだと思います