我有多对多的客户和组表。例如,我有 gold 组。该组由一些客户实例组成。我需要那些不是 gold 会员的客户名单。我使用此查询的简单解决方案
Select * from customer where id not in (select customer_id from customer_group where group_id = 1)
这个解决方案是最糟糕的,当我的数据库长大,成千上万的客户实例。我需要建议一种有效的方法来解决这个问题。
答案 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
执行计划 - 子查询成本更高。
答案 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
表返回所有信息。