2016-04-18 5 views
0

У меня есть таблицы клиентов и групп, во многих отношениях. Например, у меня есть золото группа. Эта группа состоит из некоторого экземпляра клиента. Мне нужен список клиентов, что НЕ В золото участник. Простое решение Я использую этот запросПолучить остальную часть данных во многих отношениях

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

Это решение будет худшим, когда моя база данных вырастет, тысячи экземпляров клиентов. Мне нужно предложить эффективный подход к этому условию.

+0

Сколько строк находится в таблице клиентов? –

+1

В худшем случае. У меня 10 000 клиентов. И 9999 из них - золотой член. Как я получаю 1 клиент, а не золотой член? – windupurnomo

ответ

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; 
0

Вы можете использовать присоединяется вместо подзапросов: планы

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

Execution - затраты подзапросы больше.

enter image description here

0

Вы можете использовать не существует запрос вместо того, где в.

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 с таким же customer_id, как идентификатор языка C, а также является gold членом , И если нет строки, возвращаемой (это значит, что она не существует), мы возвращаем всю его информацию из таблицы customer.

Смежные вопросы