2015-10-26 47 views
0

通过排除不匹配第二个表中所有外键的行,我们正在努力减轻搜索结果的数量,从而减少搜索结果的数量。仅返回共享相同Foriegn键的主键

例如,我们有一个匹配的文件标签,每个文档可以有无限数量的标记关系的映射表:

DocID | TagID 
12 | 1 
12 | 2 
34 | 1 
53 | 1 
53 | 4 
66 | 1 
66 | 2 
67 | 3 

我们根据名单上建设我们的存储过程的表tagIDs通过在用户,所以我们有一个看起来像这样的第二个表:

TagID 
1 
2 

我们想要做的是从包含上中的每一个值匹配的第一个表只返回行第二个表,实际上是一个“和”查询。因此,如果用户传入标签值1 & 2,我们希望返回DocID 12和66.现在,我们的连接基本上返回“或”结果,因此值将返回DocID 12,34和66.

我们目前坚持使用MS SQL 2008R2。

回答

4

您可以group byhaving和扭曲做到这一点:

select docid 
from firsttable t1 join 
    secondtable t2 
    on t1.tagid = t2.tagid 
group by docid 
having count(*) = (select count(*) from secondtable); 

您可能需要count(distinct)如果任一表可能有重复。

+0

你是对的,这绝对是一个dup,我保证我先搜索。两者都有很好的答案。谢谢。 –

+0

@ButterDuck。 。 。这个问题可能是一个问题,但不是那个问题。您正在将您的列表存储在一个表中。 –