2012-02-10 3 views
0

Я пытаюсь найти наиболее эффективный способ подсчета числа случаев, когда ключевое слово появляется в моей таблице документов на основе определенного списка идентификаторов документов, переданных в мою хранимую процедуру.SQL-подсчет вхождения ключевых слов в документе

Параметр SP принимает параметр @DocIds в виде разделенного запятой списка, например. 100, 2010, 2340

Что я хочу сделать, это выбрать записи, где DocID существует в разделенном запятой списке, который я передаю и записывает ключевые слова во временную таблицу, но также сохраняю счет, если ключевое слово имеет уже добавлен в мою временную таблицу.

Так, например (документ таблицы):

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

таблица Temp возвратит:

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

Я уверен, что некоторые SQL гуру имеет большое решение для этого, любая помощь будет принята с благодарностью ,

Большое спасибо M

+0

Вы должны включить базу данных и версию, поскольку решения для разбора разделенных запятой полей сильно зависят от этого. –

+0

Хороший вызов - я использую SQL Server 2008 – user1202263

ответ

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

0

Если предположить, что вы используете SQL Server, рассмотрите один из многочисленных ответов для разделения строки на отдельные строки, например How to split a string in T-SQL?

Тогда ваши шаги:
1. Анализировать список соответствующих DOC идентификаторов во временную таблицу (@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

Обратите внимание, что вы хотите использовать переменную таблицы, как правило, только тогда, когда вы ждете несколько ответы или временную таблицу для большего.

Смежные вопросы