2016-04-10 7 views
0

Angenommen, ich habe eine Tabelle, nennen wir sie "Kauftabelle" in SQL Server, die den Kauf durch den Benutzer darstellt.In SQL Server wie man einige bedeutungsvolle Daten von einer Chronik ähnlichen Tabelle erhält?

Table name: purchase 
purchase_id  buyer_member_id  song_id 
1     101     1001 
2     101     1002 
3     102     1001 
4     102     1003 
5     103     1001 
6     103     1003 
7     103     1004 

Jetzt habe ich versucht, einige Statistiken aus dieser Tabelle zu machen. Ich will wissen, wer beiden Songs gekauft hat 1001 und 1003.

select distinct buyer_member_id from purchase where 
buyer_member_id in (select buyer_member_id from purchase where song_id = 1001) 
and buyer_member_id in (select buyer_member_id from purchase where song_id = 1003) 

Dies funktioniert aber, wenn wir mehr und mehr Kriterien die Gleichung hinzuzufügen, wurde es langsamer und langsamer. Es ist fast unmöglich, etwas zu forschen wie Leute, die a, b und c kaufen, aber nicht d oder f. Ich verstehe, dass die Natur dieses und die Verwendung von „wo someid in (select someid aus der Tabelle, wo etwas) ist wahrscheinlich nicht der beste Weg, es zu tun.

Frage ist, gibt es einen besseren Weg?

Antwort

1

ich nenne diese „Set-in-a-Set“ Abfragen und wie ihnen zu nähern mit group by und having.

select buyer_member_id 
from purchase p 
group by buyer_member_id 
having sum(case when song_id = 1001 then 1 else 0 end) > 0 and 
     sum(case when song_id = 1003 then 1 else 0 end) > 0; 

die sum() zählt die Anzahl der Käufe, die jeden Song passen die > 0 sagt, dass es zumindest 1. Und = 0 würde sagen, dass es keine gibt.

+0

Danke! Ich wusste nicht, dass dieses Keyword hat, große Hilfe! – shawhu

Verwandte Themen