2012-02-10 82 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大师有一个很好的解决方案的任何帮助将不胜感激。

非常感谢 中号

+0

您应该包含数据库和版本,因为用于解析逗号分隔字段的解决方案高度依赖于此。 – 2012-02-10 15:27:08

+0

良好的通话 - 我正在使用SQL Server 2008 – user1202263 2012-02-10 15:48:49

回答

1

这是SQL Server 2005+的解决方案。它使用递归CTE产生的话

样本数据和临时表创建

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

我认为你必须为每个关键字

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

Ask Tom运行一个查询,有选择出一个关键字列表的技术。 用这种技巧和一个GROUP BY关键字,你可以得到COUNT(*) ,这正是你正在寻找的。

+0

感谢您的输入伙计 - 我应该提到如上所述我使用Sql Server 2008 – user1202263 2012-02-10 15:50:20

0

假设你正在使用SQL的计数服务器,查看将字符串分成单独行的许多答案之一,例如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

注意,你会使用一个表变量通常只有在你希望的几个答案或更多的临时表。