2010-11-04 2 views
3

у меня есть база данных с таблицей документовВЫБРАТЬ из нескольких критериев

DocumentID DocTitle DocDesc 

и таблицами ключевых слов

KeywordID Keyword 

связанной таблицей DocumentKeyword

DocumentID KeywordID 

я использовал вид чтобы предоставить набор данных для всех документов-ключевых слов.

DocumentID DocTitle DocDesc Keyword 

Я ищу запрос выбора, который позволит мне искать документы по ключевому слову. Для одного ключевого слова это не проблема, я могу это сделать. Но я хотел бы иметь возможность использовать более одного ключевого слова для запроса и возвращать documentID (один раз) для документов, помеченных всеми данных ключевых слов.

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

Любая помощь была бы принята с благодарностью.

Благодаря

+0

Пожалуйста укажите пример ожидаемого результата. В частности, у вас есть столбец с названием «ключевое слово» для желаемого вывода, но как вы ожидаете, что в нем будет отображаться несколько ключевых слов? –

+0

Вы согласны с неизвестным количеством ключевых слов? –

+0

@OMG Ponies: Единственный вывод, который мне нужен, это список идентификаторов документов, которые соответствуют всем предоставленным ключевым словам. Например, если выбраны ключевые слова: «ИТ» и «Финансы», любой идентификатор документа, связанный с ними, потребуется, даже если у них есть другие. Но они должны иметь и то, и другое. – Slotty

ответ

5

Если вам необходимо указать keyword, а не keywordid значение - использование:

SELECT d.documentid 
    FROM DOCUMENT d 
    JOIN DOCUMENTKEYWORD dk ON dk.documentid = d.documentid 
    JOIN KEYWORD k ON k.keywordid = dk.keywordid 
        AND k.keyword IN ('keyword1', 'keyword2', 'keyword3') 
GROUP BY d.documentid 
    HAVING COUNT(DISTINCT k.keyword) = 3 

Главное - это комбинация предложений IN и HAVING - COUNT должен соответствовать количеству значений, указанным в предложении IN.

Если бы это было keywordid, вы можете сохранить объединение и использование:

SELECT d.documentid 
    FROM DOCUMENT d 
    JOIN DOCUMENTKEYWORD dk ON dk.documentid = d.documentid 
          AND dk.keywordid IN (1, 2, 3) 
GROUP BY d.documentid 
    HAVING COUNT(DISTINCT dk.keywordid) = 3 
+0

Большое спасибо, это именно то, что мне нужно. Я посмотрю на отправку KeywordID, но я думаю, что для этого потребуется отдельная поездка в БД. – Slotty

+0

Я изучил это. Поскольку представление уже содержит соединение, я изменил ваш оператор tp, используя представление, см. Мой ответ ниже. В любом случае, я должен был сделать это для некоторых других функций. – Slotty

0

Вам не нужно делать вид, что вы делаете (хотя ваш свободно использовать, если вы думаете, что делает ваш код понятнее). Использование AND (желательно с ORM для выполнения SQL-переборов) является самым простым.

Я думаю, что это будет работать так же хорошо (хотя я не рекомендую использовать его):

SELECT DISTINCT documents.DocumentID 
    FROM documents 
    WHERE (SELECT DISTINCT count(*) FROM DocumentKeyword 
      WHERE KeywordID = ANY 
       (SELECT keyword.KeywordID FROM keyword 
       WHERE Keyword 
       IN ('keyword 1', 'keyword 2', 'keyword 3')) 
      AND DocumentID = documents.DocumentID)) = 3; 
+0

Спасибо Зак, но это действует как инструкция OR.Мне нужен документ, чтобы соответствовать всем ключевым словам, а не любым из них, например, над выражением AND в разных строках, если это имеет смысл? – Slotty

+0

Спасибо за исправление, я исправил свой ответ. –

+0

Привет, Зак, просто чтобы вы знали. Я попробовал это, но получил сообщение об ошибке «Msg 4145, Level 15, State 1, Line 8 Выражение небулевого типа, указанное в контексте, где ожидается условие, рядом с«) ». С уважением – Slotty

0

Заявление, как представленный OMG Ponies но переработан использовать вид:

SELECT 
    d.documentid 
FROM 
    v_AllDocumentKeyword d 
WHERE 
    d.keyword IN ('Keyword1','Keyword2','Keyword3') 
GROUP BY 
    d.documentid 
HAVING 
    COUNT(DISTINCT d.keyword) = 3 

Благодарности

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