Sql 表中与列匹配的多条记录

Sql 表中与列匹配的多条记录,sql,sql-server,database,procedures,Sql,Sql Server,Database,Procedures,my DB的体系结构涉及标记表中的记录。标记表中的每条记录都有一个字符串,该字符串是另一个工作者表中记录的PrimaryID Worker表中的记录具有标记。每次为工作者创建标记时,我们都会在标记表中添加一个新行,将输入的名称和外键添加到工作者的PrimaryID中。因此,对于同一个工人,我们可以有多个具有不同名称的标记 工作表 ID | Worker Name | Other Information _______________________________

my DB的体系结构涉及标记表中的记录。
标记
表中的每条记录都有一个字符串,该字符串是另一个
工作者
表中记录的
PrimaryID

Worker表中的记录具有标记。每次为工作者创建标记时,我们都会在标记表中添加一个新行,将输入的名称和外键添加到工作者的PrimaryID中。因此,对于同一个工人,我们可以有多个具有不同名称的标记

工作表

ID         |   Worker Name    |    Other Information
__________________________________________________________________
1          |   Worker1        | ..........................
2          |   Worker2        | ..........................
3          |   Worker3        | ..........................
4          |   Worker4        | ..........................
ID         |Foreign Key(WorkerID) |    Name
__________________________________________________________________
1          |   1                  | foo
2          |   1                  | bar
3          |   2                  | foo
5          |   3                  | foo
6          |   3                  | bar
7          |   3                  | baz
8          |   1                  | qux
标签表

ID         |   Worker Name    |    Other Information
__________________________________________________________________
1          |   Worker1        | ..........................
2          |   Worker2        | ..........................
3          |   Worker3        | ..........................
4          |   Worker4        | ..........................
ID         |Foreign Key(WorkerID) |    Name
__________________________________________________________________
1          |   1                  | foo
2          |   1                  | bar
3          |   2                  | foo
5          |   3                  | foo
6          |   3                  | bar
7          |   3                  | baz
8          |   1                  | qux

我的目标是根据输入的字符串表过滤
WorkerID
。我想得到一组与输入的标签相同的
WorkerID
。例如,如果输入的字符串是
foo
bar
,我想返回
WorkerID
的1和3。你知道怎么做吗?我在想和分组或加入表格有关的事情。我是SQL新手,似乎不太懂

这是关系划分的一种变体。这里有一个尝试:

select workerid 
from tags
where name in ('foo', 'bar')
group by workerid
having count(distinct name) = 2

您可以使用以下选项:

select WorkerID
from tags where name in ('foo', 'bar')
group by WorkerID
having count(*) = 2
这将检索到您想要的结果/

问候。

是这方面的优秀资源

尽管@Lennart的答案在查询分析器中运行良好,但如果不让自己受到SQL注入攻击,您将无法在存储过程或消费应用程序中复制它。为了扩展该解决方案,您需要考虑将标记列表作为表值参数传递,因为SQL不支持数组

基本上,您可以在数据库中创建一个自定义类型,该类型模拟只有一列的表:

CREATE TYPE list_of_tags AS TABLE (t varchar(50) NOT NULL PRIMARY KEY)
然后在内存中填充该类型的实例:

DECLARE @mylist list_of_tags
INSERT @mylist (t) VALUES('foo'),('bar')
然后,您可以通过/已在前面的答案中描述的方式,使用组将其作为连接进行选择:

select workerid 
from tags inner join @mylist on tag = t    
group by workerid
having count(distinct name) = 2

*注意:我不在可以测试查询的计算机前。如果有人发现我的问题有缺陷,请让我知道,我会很乐意纠正并感谢他们。

谢谢!实际上,我使用的是一个表类型
StringList
,其中只有一列是字符串。我的目的是为了存储过程,所以这正是我想要的。干杯