2016-04-18 7 views
0

私は顧客テーブルとグループテーブルを、多対多の関係で使用しています。たとえば、私はグループを持っています。このグループは、いくつかの顧客インスタンスで構成されています。私はメンバーではないお客様のリストが必要です。シンプルなソリューション私はこのクエリを使用します多対多の関係でデータを残ります

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

私のデータベースが成長すると、このソリューションは、数千の顧客インスタンス。私はこの条件のための効果的なアプローチの提案が必要です。

+0

customersテーブルにはいくつの行がありますか? –

+1

最悪の場合のシナリオ。私は10,000人の顧客を持っています。そして9,999人が金のメンバーです。金のメンバーではなく1人の顧客をどうやって得るのですか? – windupurnomo

答えて

0

where in節は非常に非効率的で重いデータベースになる可能性があるため、避けるべきです。代わりに、あなたがより良いパフォーマンスを得るためjoinを使用する必要があります

Is SQL IN bad for performance?を参照してください):あなたが使用することができ

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

ではなく、サブクエリの加入:

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

実行計画を - サブクエリのコストが大きくなっています。あなたはこの中。

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

に、我々は最初のCのIDと同じcustomer_idcustomer_groupに顧客を見つけるともgoldメンバーであるされている場合、クエリが存在する代わりのない使用することができます

enter image description here

0

。返された行がない場合(存在しないことを意味する)、すべての情報をcustomerテーブルから返します。