我的数据库的体系结构涉及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
组。例如,如果输入的字符串为foo
和bar
,我想返回WorkerID
的1和3.任何想法如何执行此操作?我在想与GROUP BY或JOINING表有关。我是SQL的新手,似乎无法弄明白。
答案 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
*注意:我不在可以测试查询的计算机上。如果有人在我的查询中发现了一个漏洞,请告诉我,我会很乐意纠正它并感谢他们。