2012-02-10 11 views
0

私は、ストアドプロシージャに渡される特定の文書IDのリストに基づいて、キーワードが文書テーブルに現れる出現回数を数えるのに最も効率的な方法を試しています。SQL文書のキーワードの出現回数

SPは、パラメータ@DocIdsをカンマ区切りリストとして指定します。 100、2010、2340

DocIDが存在するレコードを、私が渡しているカンマ区切りリストに選択し、キーワードを一時テーブルに記録するだけですが、キーワードがある場合はカウントを保持します。すでに私の一時テーブルに追加されています。例えばので

(原稿台):表が戻ってくる

DocID | Keywords 
----------------------------- 
100 | Test, Document, Info 
2010 | Document, users 
4  | ....  
2340 | users, client 

温度:

Keyword | Count 
Test  | 1 
Document | 2 
Info  | 1 
users | 2 
client | 1 

私は任意の助けをいただければ幸いいくつかのSQLの第一人者が、このための最適なソリューションを持っていると確信しています。私はあなたが

INSERT INTO tmp VALUES ('users',(
    SELECT COUNT(DocID) FROM Documents WHERE keywords LIKE '%users%') 
) 
+0

カンマ区切りフィールドを解析するソリューションはこれに大きく依存するため、データベースとバージョンを含める必要があります。 –

+0

良い呼び出し - 私はSQL Server 2008を使用しています – user1202263

答えて

1

ここでは、SQL Server 2005+のソリューションを紹介します。それはあなたがSQLを使用していると仮定すると、言葉

サンプルデータと一時テーブルの作成

CREATE Table #Temp ([Count] int, Keyword varchar(max)); 

DECLARE @document AS TABLE ( 
    docid INT, 
    keywords VARCHAR(MAX)) 

INSERT INTO @document 
VALUES  (100, 'Test, Document, Info'), 
      (2010, 'Document, users'), 
      (4, '....'), 
      (2340, 'users, client') 

クエリ

; WITH cte(docid, word, keywords) 
     AS (SELECT docid, 
        LEFT(keywords, Charindex(',', keywords + ',') - 1), 
        Stuff(keywords, 1, Charindex(',', keywords + ','), '') 
      FROM @document 
      UNION ALL 
      SELECT docid, 
        LEFT(keywords, Charindex(',', keywords + ',') - 1), 
        Stuff(keywords, 1, Charindex(',', keywords + ','), '') 
      FROM cte 
      WHERE keywords > '') 
    INSERT INTO #Temp ([Count], Keyword) 
    SELECT COUNT(docid), 
      Ltrim(Rtrim(word)) 
    FROM cte 
    GROUP BY Ltrim(Rtrim(word)) 

    SELECT [Count], Keyword FROM #temp 

出力

Count  Keyword 
-------- ----- 
1   .... 
1   client 
2   Document 
1   Info 
1   Test 
2   users 
0

は、キーワードリストから選択する技術を持っています。 この手法とGROUP BYキーワードを使用すると、あなたが探しているものと正確に一致するCOUNT(*) を取得できます。

0

Ask Tomキーワードごとにクエリを実行する必要があると思います

感謝 M

+0

入力のおかげでありがとう - 私は上記のように指摘しておく必要があります私はSQL Server 2008を使用している – user1202263

0

のカウントを生成するために、再帰CTEを使用していますサーバー、文字列を個々の行に分割するための多くの答えの1つを見てください。例えばHow to split a string in T-SQL?

は、その後、あなたの手順は次のとおりです。
1.この機能を使用して解析一時テーブルに関連するドキュメントIDのリスト(@selectedDocs)(データ型変換が必要になる場合があります)
2.別の一時テーブルを移入します(@これらの文書で使用されるキーワードとキーワード):各キーワードが使用されている
insert into @keywords (docID, keyword)
select d.docID, ltrim(rtrim(words.s))
from @selectedDocs sd
inner join @documents d on d.docID = sd.docID
cross apply (select * from dbo.Split(',', d.keywords)) words
3カウント回数:あなただけの場所がいくつかを期待している通常のテーブル変数を使用したい
select k.keyword, count(k.docID)
from @keywords k
group by k.keyword

注意答え、または一時的な表を参照してください。

関連する問題