-1

我正在寻找一种方法来匹配行 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
4

1 回答 1

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子句的顺序都会发生变化。

于 2013-08-16T10:52:47.557 回答