表中的多个记录与列匹配

时间:2014-07-01 17:51:23

标签: sql sql-server database procedures

我的数据库的体系结构涉及Tags表中的记录。 Tags表中的每个记录都有一个Name的字符串和另一个PrimaryID's表中记录的Worker的外来字符。

Worker表中的记录包含标签。每次我们为worker创建一个Tag时,我们在Tags表中添加一个新行,输入的Name和外键到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

我的目标是根据输入的字符串表过滤WorkerID。我想获得与输入标签具有相同标签的WorkerID组。例如,如果输入的字符串为foobar,我想返回WorkerID的1和3.任何想法如何执行此操作?我在想与GROUP BY或JOINING表有关。我是SQL的新手,似乎无法弄明白。

3 个答案:

答案 0 :(得分:0)

这是关系分裂的变体。这是一次尝试:

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

答案 1 :(得分:0)

您可以使用以下内容:

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

这将检索您想要的结果/

问候。

答案 2 :(得分:0)

This article是这个主题的绝佳资源。

虽然@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')

然后你可以选择使用前面答案中描述的GROUP BY / HAVING作为连接:

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

*注意:我不在可以测试查询的计算机上。如果有人在我的查询中发现了一个漏洞,请告诉我,我会很乐意纠正它并感谢他们。