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