从多个标准中选择

时间:2010-11-04 22:00:12

标签: sql sql-server tsql

我有一个带文件表的数据库

DocumentID   DocTitle   DocDesc

和关键字表

KeywordID    Keyword

通过DocumentKeyword表链接

DocumentID   KeywordID

我使用了一个视图来提供所有文档关键字实现的数据集。

DocumentID   DocTitle   DocDesc   Keyword

我正在寻找一个select语句,让我按关键字搜索文档。对于一个关键字,我可以做到这一点没问题。但我希望能够为查询使用多个关键字,并为使用所有给定关键字标记的文档返回documentID(一次)。

我陷入困境,我最大的问题是我甚至无法找到要搜索的内容。我意识到这个观点可能没有必要。

非常感谢任何帮助。

由于

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

答案 2 :(得分: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

由于