查找满足多个条件且具有多对多关系的行

时间:2017-05-30 11:03:45

标签: sql logic

为了简单起见,假设我有一个包含客户端的表和他们持有的产品,如下所示:

Client_ID        Product_Held
    1            Product1
    1            Product2
    1            Product3
    2            Product1
    2            Product2
    3            Product1
    3            Product1

客户可以持有产品的任意组合,以及同一产品的倍数。

我希望能够将查询限制在仅包含Product1和Product2的所有客户端,并且我在确定所需的逻辑时遇到了一些困难。如果我搜索具有Product1和Product2的所有客户,我的结果将包括仅持有Product1的用户以及仅持有Product2的用户。

过去我只是将我的结果转储到Excel中,添加了一个结合两个字段的列,即1Product1,1Product2,并编写一个快速公式,基本上说如果1Product1存在,并且1Product2存在,则标记为OK并过滤掉其他所有内容,但可能相反,通过我的查询来完成它应该是相当简单的。

我觉得我应该有类似的东西:

WHERE Client_ID exists in Client_ID + Product_Held AND Product_Held = 'Product1'
AND Client_ID exists in Client_ID + Product_Held AND Product_Held = 'Product2'

但是语法有问题,也不确定这是否是一个有效的方法?

1 个答案:

答案 0 :(得分:0)

您可以使用聚合和having

执行此操作
select client_id
from t
group by client_id
having sum(case when product_held = 'Product1' then 1 else 0 end) > 0 and
       sum(case when product_held = 'Product2' then 1 else 0 end) > 0 and
       sum(case when product_held in ('Product1', 'Product2') then 1 else 0 end) = count(*);

这是做什么的?前两个条件是计算每个产品为每个客户显示的次数。 > 0表示至少有一个。

最后一个条件检查两个产品的数量是否与所有行匹配。这保证了所有产品都是这两种产品。您也可以将其表达为:

       sum(case when product_held not in ('Product1', 'Product2') then 1 else 0 end) = 0;