在多对多关系中获取其余数据

时间:2016-04-18 09:23:10

标签: sql algorithm

我有多对多的客户和组表。例如,我有 gold 组。该组由一些客户实例组成。我需要那些不是 gold 会员的客户名单。我使用此查询的简单解决方案

Select * from customer where id not in (select customer_id from customer_group where group_id = 1)

这个解决方案是最糟糕的,当我的数据库长大,成千上万的客户实例。我需要建议一种有效的方法来解决这个问题。

3 个答案:

答案 0 :(得分:0)

where in子句对数据库的效率非常低且很重,因此应该避免。 (见Is SQL IN bad for performance?

相反,您应该使用join来获得更好的效果:

SELECT * FROM customer 
LEFT JOIN customer_group
ON customer.customer_id = customer_group.customer_id 
WHERE customer_group.group_id <> 1;

答案 1 :(得分:0)

您可以使用联接而不是子查询:

 Select * 
 from 
        customer cc
        inner join customer_group grp on grp.customer_id=cc.customer_id
 where 
     grp.group_id <>1

执行计划 - 子查询成本更高。

enter image description here

答案 2 :(得分:0)

您可以使用not exists查询而不是where in。

 Select * from customer c 
  where 
 not exists(select customer_id from customer_group g 
      where group_id = 1 and c.id = g.customer_id);

在此,我们首先在customer_group中找到与c的ID相同customer_id的客户,同时也是gold成员。如果没有返回行(这意味着它不存在),我们将从customer表返回所有信息。