2016-03-25 16 views
0

Her biri 2012, 2013 ve 2014 yılları için aktif müşteri listesi içeren A, B ve C olmak üzere üç tablomuz var. Her üç yılda bir aktif olan müşterilerin listesini almak istiyorum.İç içe geçme Sipariş

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 

Ama bu farklı sonuçlar verecek: ben bu şekilde yapıyorum

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 

teşekkür ederiz!

cevap

2

sırası bir fark yapmaz inner join için katılır. tablolardan biri customer_id başına bir satırda bir "ana" Tablo ise

Ancak, o zaman yapmak daha verimlidir:

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

Bu select distinct için yinelenen azalma ortadan kaldırır.

+0

Teşekkür ederiz! Siparişin bir fark yarattığından emin değildim. Cevabı çok takdir ediyorum! –

1

Hayır, çünkü iç birleştirme yapıyorsunuz. İçsel birleşmeler bir kesişim noktasıdır, bu nedenle, bir araya getirdiğiniz sıraya bakılmaksızın, sadece 3'lük kısımda yer alan sadece kimlikler geçerlilik kazanacaktır. Bir dış birleştirme yaparsanız, sipariş hakkında daha fazla endişelenmeniz gerekir.

+0

Teşekkür ederiz! Bunun temel bir soru gibi göründüğünü biliyorum ve bunu kendim deneyebilirim, ama bu düşünce bana evde, SQL'e erişimim olmadığı için geldi. –

1

Hayır, iç birleştirme bir kavşak olduğundan farklı bir sonuç olmamalıdır.

İşte bir örnek. "Empid" 1 & 2, 3 yıl boyunca çalışmış olan çalışanlardır.

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

sadece üç tablolarda bulunmadığı müşteriler sizin de bir dizi operasyon kullanabilirsiniz isterseniz: hiçbir açık DISTINCT var

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

ama buna İşlemleri varsayılan ayarlamak ve iyileştirici nasıl bilir En verimli şekilde. Tabii ki, gerçek verilere/dizinlere bağlı olarak, Gordon'un EXISTS kullanarak cevabı daha hızlı olabilir.