我们正在努力采用轻量级方法,通过排除与第二个表中的所有外键不匹配的行来减少更多搜索结果中的结果。
例如,我们有一个映射表,它将文档与标记匹配,其中每个文档可以具有无限数量的标记关系:
DocID | TagID
12 | 1
12 | 2
34 | 1
53 | 1
53 | 4
66 | 1
66 | 2
67 | 3
我们正在根据用户传入的tagID列表在SPROC中构建一个表,因此我们有第二个表如下所示:
TagID
1
2
我们要做的是只返回第一个表中包含第二个表中每个值匹配的行,实际上是“和”查询。因此,如果用户传入标签值1& 2我们想要返回DocID 12和66.现在我们的连接基本上返回一个“或”结果,因此值1& 2将返回DocID 12,34和66。
我们目前仍然使用MS SQL 2008R2。
答案 0 :(得分:4)
您可以使用group by
和having
以及扭曲:
select docid
from firsttable t1 join
secondtable t2
on t1.tagid = t2.tagid
group by docid
having count(*) = (select count(*) from secondtable);
如果任何一个表都有重复项,则可能需要count(distinct)
。