跨表匹配行

时间:2013-08-16 10:49:18

标签: sql sql-server-2008-r2

我正在寻找一种方法来匹配b / w两个表的行。

name_tokens
-----------------
product_id, tokens
----------------
1, token 1
1, token 2
1, token 3
2, token 1
2, token 2
3, token 1
4, token 1

-----------
models_tokens
---------------
product_id, tokens
------------------
1, token 1
1, token 2
2, token 1
3, token 1
4, token 1

因此,基本上一个表包含产品的模型标记,而另一个表包含产品的名称标记。我希望获得名称标记包含所有模型标记的所有产品。

会是这样的。 1.)对于每种产品,请查看产品的型号令牌数量 2.)检查名称标记是否存在该产品的每个模型标记。如果是,则计算匹配。

我希望我能清楚地说明这一点。如果不是,我会对该问题提出任何要求。

修改

---------
name_tokens
-----------------
product_id, tokens
----------------
1, hello
1, world
1, stackoverflow
2, Stack 
2, overflow
3, stack
4, flow

-----------
models_tokens
---------------
product_id, tokens
------------------
1, hello
1, stackoverflow
2, ovreflow
3, overflow
4, stack

所以我需要的结果是

product_id
1
2

1 个答案:

答案 0 :(得分:1)

您可以使用左外连接和聚合来执行此操作:

select nt.product_id
from name_tokens nt left outer join
     model_tokens mt
     on nt.product_id = mt.product_id and
        nt.tokens = mt.tokens
group by nt.product_id
having count(mt.product_id) = count(*);

此查询的作用是从name_tokens表开始,并查找model_tokens表中的所有匹配项。如果没有匹配项,则会为NULL中的行分配mt(由left outer join提供)。 having子句返回第二个表中具有相同匹配数的所有产品,因为第一个表中有令牌。

编辑:

反过来说,您可以反转查询:

select mt.product_id
from model_tokens mt  left outer join
     name_tokens nt
     on nt.product_id = mt.product_id and
        nt.tokens = mt.tokens
group by mt.product_id
having count(nt.product_id) = count(*);

请注意having子句以及连接顺序和group by子句的更改。