2016-03-25 2 views
0

У меня есть три таблицы - A, B и C, каждая из которых содержит список активных клиентов на 2012, 2013 и 2014 годы, соответственно. Я хочу получить список клиентов, которые были активны за все три года. Я делаю это так:Внутреннее соединение Заказать

select distinct customer_id 
from table_A a 
inner join table_B b on a.customer_id=b.customer_id 
inner join table_C c on a.customer_id=c.customer_id 

Но будет ли давать разные результаты, чем это:

select distinct customer_id 
from table_A a 
inner join table_B b on a.customer_id=b.customer_id 
inner join table_C c on b.customer_id=c.customer_id 

Спасибо!

ответ

2

Порядок присоединений для inner join не имеет значения.

Однако, если одна из таблиц является «мастер» таблица с одной строкой на customer_id, то это более эффективно делать:

select a.customer_id 
from table_A a 
where exists (select 1 from table_B b where a.customer_id = b.customer_id) and 
     exists (select 1 from table_C c on a.customer_id = c.customer_id); 

Это устраняет повторяющиеся сокращения для select distinct.

+0

Спасибо! Я не был уверен, что порядок имеет значение. Очень ценю ответ! –

1

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

+0

Спасибо! Я знаю, что это похоже на основной вопрос, и я мог бы просто попробовать это сам, но эта мысль пришла ко мне дома, где у меня нет доступа к SQL. –

1

Нет, это не должно быть разным результатом, поскольку внутреннее соединение является пересечением.

Вот пример. «empid» 1 & 2 - это сотрудники, которые работали все 3 года.

mysql> select * from t2012; 
+-------+ 
| empid | 
+-------+ 
|  1 | 
|  2 | 
|  3 | 
+-------+ 
3 rows in set (0.00 sec) 

mysql> select * from t2013; 
+-------+ 
| empid | 
+-------+ 
|  1 | 
|  2 | 
|  3 | 
|  4 | 
+-------+ 
4 rows in set (0.00 sec) 

mysql> select * from t2014; 
+-------+ 
| empid | 
+-------+ 
|  1 | 
|  2 | 
|  4 | 
|  5 | 

mysql> select distinct a.empid from t2012 a 
inner join t2013 b on a.empid = b.empid 
inner join t2014 c on a.empid=c.empid; 
+-------+ 
| empid | 
+-------+ 
|  1 | 
|  2 | 
+-------+ 
2 rows in set (0.00 sec) 

mysql> select distinct a.empid from t2012 a 
inner join t2013 b on a.empid = b.empid 
inner join t2014 c on b.empid=c.empid; 
+-------+ 
| empid | 
+-------+ 
|  1 | 
|  2 | 
+-------+ 
2 rows in set (0.00 sec) 
1

Если вы просто хотите, чтобы клиенты, которые существуют во всех трех таблицах вы можете использовать операцию набора, тоже:

select customer_id from table_A 
INTERSECT 
select customer_id from table_B 
INTERSECT 
select customer_id from table_C 

Там нет явного DISTINCT, но установка операций по умолчанию для него и оптимизатор знает, как это сделать это наиболее эффективно.

Конечно, в зависимости от фактических данных/индексов ответ Гордона с использованием EXISTS может быть быстрее.

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

  • Нет связанных вопросов^_^