18

ストアド プロシージャ/クエリを作成するときに、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 + '%'

これは可能ですか、推奨されますか?

このようなことを行うより良い方法はありますか?


文節の両端にワイルドカードを入れているのは、カード テキストで使用される「魔王」、「獣戦士」、「直接ダメージ」、「戦闘ダメージ」という用語があるためです。

パフォーマンスに応じて、指定したクエリを使用するか、全文キーワード検索を使用して同じタスクを実行できるかという印象を受けます。

テキスト検索したいフィールドでサーバーにテキスト インデックスを作成させる以外に、他に何かする必要がありますか?

4

10 に答える 10

10

これを試して

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

この方法は理想的ではありません。注意して使用してください。

于 2013-01-29T19:35:43.420 に答える
5

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

SQL Server を使用している場合は全文検索を試すか、Lucene実装の 1 つを調べてください。ジョエルは最近、それでの成功について話しました。

于 2008-08-21T17:06:11.050 に答える
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)

これにより、ボルト オン ソリューションを実装することなくインデックスを使用でき、データをアトミックに保つことができます。

関連:タグまたはタグ付けに推奨される SQL データベース設計

于 2008-08-21T17:27:33.060 に答える
1

ストアド プロシージャで「厳密に型指定された」リスト解析を行うために少し前に取り上げたトリックは、リストをテーブル変数/一時テーブルに解析することです。

ここでほのめかしているのは、含めるキーワードをテーブルに入れ、関係分割を使用して一致を見つけることです (除外する単語に別のテーブルを使用することもできます)。SQL での実際の例については、Joe Celko による Keyword Searches を参照してください。

于 2009-05-01T08:52:31.220 に答える
1

全文検索を探しているようです。カードの説明に対して一連のキーワードをクエリして、ヒットを見つけたいからですか? 正しい?

于 2008-08-21T16:57:17.170 に答える
1

個人的には、以前にやったことがありますが、うまくいきました。私が見ることができる唯一の問題は、インデックスのない列の問題である可能性がありますが、where 句でも同じ問題が発生すると思います。

あなたへの私のアドバイスは、2つの間の実行計画を見てください。良いプログラミングの問題がすべてそうであるように、状況によってどちらが優れているかは異なると思います。

于 2008-08-21T16:57:28.357 に答える
0

これを試して;

SELECT Id, Name, Description
FROM dbo.Card
INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + 
                                CONCAT(CONCAT('%',@tblKeyword.Value),'%') + '%'
于 2009-05-21T07:40:35.017 に答える
0

パフォーマンスは、使用する実際のサーバー、データのスキーマ、およびデータの量に依存します。現在のバージョンの MS SQL Server では、そのクエリは問題なく実行されるはずです (MS SQL Server 7.0 ではその構文に問題がありましたが、SP2 で対処されました)。

そのコードをプロファイラーで実行しましたか? パフォーマンスが十分に速く、データに適切なインデックスが配置されていれば、準備は万端です。

于 2008-08-21T17:01:59.920 に答える
0

LIKE '%fiend%' はシークを使用しませんが、LIKE 'fiend%' は使用します。単純にワイルドカード検索はサージ可能ではありません

于 2008-08-21T17:08:00.313 に答える