Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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,有关表格: Persons ------------------- PersonID (PK) FirstName LastName Descriptors ------------------- DescriptorID (PK) Description PersonDescriptors ------------------- PersonID (PK)(FK) DescriptorID (PK)(FK) 你好, 我有三个表:Persons、descriptor和personeds

有关表格:

Persons
-------------------
PersonID (PK)
FirstName
LastName


Descriptors
-------------------
DescriptorID (PK)
Description


PersonDescriptors
-------------------
PersonID (PK)(FK)
DescriptorID (PK)(FK)
你好,

我有三个表:Persons、descriptor和personedscriptors。我试图找出一个查询:

  • 获取一个可能的人物描述列表(例如:22、11、9等)

  • 读取PersonDescriptors表中的实际人员描述符记录(ex row:PersonID:107,DescriptorID:22)

  • 仅当所有提供的描述符都匹配时,才返回匹配的PersonId

例如,Personid107有一头金发(DescriptorID:22),因此PersonDescriptors中有一行107/22。Personid107也有胡子(DescriptorID:11),因此在107/11的PersonDescriptors中有另一行。如果我给查询这两个描述符(22,11),它应该返回Personid107。但是如果我给出查询22、11和9,它不应该返回Personid107,因为PersonDescriptors中没有107/9行

PersonDescriptor中大约有一百万行

您将如何编写此代码

一个想法是使用WHERE NOT EXISTS语句,但我的尝试太慢(在本地SQL Server 2014实例上超过20秒):

…另一种方法是接收目标描述符的XML并将它们加载到临时表中,每个描述符一行,然后尝试一些连接魔法,但我无法理解

另一个想法是使用计数标准中的数量,但我也无法做到这一点


我缺少的想法,还是帮助?谢谢

使用
分组依据
拥有

select pd.PersonId
from PersonDescriptors pd
where pd.DescriptorID IN (1, 71)
group by pd.PersonId
having count(distinct pd.DescriptorID) = 2;

您可以轻松地将其推广到任意长度的列表。请记住更改
having
子句中的常量。

“…但是太慢了…”性能问题完全取决于您正在使用的特定DBMS产品,因此您应该让我们知道这是什么。这是关系划分:看看Joe Celko编写的这篇文章。抱歉,忘记了这一点。编辑文章:SQL Server 2014。这是我的dev box上的一个本地实例,但是WHERE NOT EXISTS查询需要20-60秒以上的时间
select pd.PersonId
from PersonDescriptors pd
where pd.DescriptorID IN (1, 71)
group by pd.PersonId
having count(distinct pd.DescriptorID) = 2;