Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从多个条件中选择_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 从多个条件中选择

Sql 从多个条件中选择,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个带有文档表的数据库 DocumentID DocTitle DocDesc 和关键字表 KeywordID Keyword DocumentID KeywordID 由DocumentKeyword表链接 KeywordID Keyword DocumentID KeywordID 我已经使用视图给出了所有文档关键字关系的数据集 DocumentID DocTitle DocDesc Keyword 我正在寻找一个select语句,它可

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

DocumentID   DocTitle   DocDesc
和关键字表

KeywordID    Keyword
DocumentID   KeywordID
由DocumentKeyword表链接

KeywordID    Keyword
DocumentID   KeywordID
我已经使用视图给出了所有文档关键字关系的数据集

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

我被困住了,我最大的问题是我甚至不知道该搜索什么。我意识到这种观点可能没有必要

任何帮助都将不胜感激


谢谢

您不需要查看您正在做的事情(尽管您可以免费使用一个视图,如果您认为它可以使您的代码更干净的话)。使用AND(最好与ORM一起进行SQL争论)是最简单的

我认为这也可以(尽管我不建议使用它):


如果需要指定
关键字
,而不是
关键字ID
值,请使用:

  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子句的组合-计数必须与
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

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

谢谢

请提供您期望的输出示例。特别是,对于您想要的输出,您有一个名为“关键字”的列,但是您希望如何在其中显示多个关键字?您会匹配未知数量的关键字吗?@OMG Ponies:我需要的唯一输出是一个匹配所有已提供关键字的DocumentID列表。例如,如果选择的关键字是“IT”和“Finance”,则需要与这些关键字关联的任何documentID,即使它们还有其他关键字。但是他们必须两者都有。@Abe:这将是一个未知的数量,但是如果我能得到2的声明,我想尝试解决它的其余部分。最好的学习方法。这让我完全不知所措。谢谢扎克,但这就像是一个或声明。我需要文档匹配所有关键字,而不是其中任何一个,比如不同行上的AND语句,如果有意义的话?嗨,扎克,我只是想让你知道。我尝试了这一点,但得到了错误消息“Msg 4145,Level 15,State 1,Line 8在预期条件的上下文中指定了一个非布尔类型的表达式,靠近“)”。考虑到这一点,这正是我所需要的。我将研究发送关键字ID,但我认为这需要单独访问数据库。由于视图已经包含join,我已经修改了您的语句,请使用视图,请参见下面的答案。无论如何,我必须为其他一些功能制作它。