我正在尝试找出最有效的方法,根据传入我的存储过程的特定文档ID列表,计算关键字在文档表中出现的次数。
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 :(得分: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
答案 1 :(得分:0)
我认为您必须为每个关键字运行查询
INSERT INTO tmp VALUES ('users',(
SELECT COUNT(DocID) FROM Documents WHERE keywords LIKE '%users%')
)
答案 2 :(得分:0)
Ask Tom,有一种从关键字列表中选择的技巧。 使用该技术和GROUP BY关键字,您可以获得COUNT(*) 这正是你要找的。 p>
答案 3 :(得分:0)
假设您正在使用SQL Server,请查看将字符串拆分为单个行的众多答案之一,例如How to split a string in T-SQL?
然后你的步骤是:
1.使用此函数将相关文档列表的列表解析为临时表(@selectedDocs)(可能需要数据类型转换)
2.使用这些文档使用的关键字填充另一个临时表(@keywords):
insert into @keywords (docID, keyword)
3.计算每个关键字的使用次数:
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
select k.keyword, count(k.docID)
from @keywords k
group by k.keyword
请注意,您通常只在需要一些答案的地方或临时表中使用表变量。