2010-12-30 9 views
3

Ich denke, das ist eine ziemlich grundlegende Frage und ich habe mich auf der Website umgeschaut, aber ich bin mir nicht sicher, wonach ich suchen soll, um die Antwort zu finden.SQL Select-Anweisung

Ich habe eine SQL-Tabelle, die wie folgt aussieht:

studentId period class 
1   1  math 
1   2  english 
2   1  math 
2   2  history 

ich für eine SELECT-Anweisung suchen, die die StudentID findet, die Mathematik 1. Periode und Englisch 2. Periode stattfindet. Ich habe etwas wie SELECT studentID WHERE (period = 1 AND class= "math") AND (period = 2 AND class = "english") versucht, aber das hat nicht funktioniert.

Ich habe auch gedacht, meinen Tisch zu sein über die Änderung:

studentId period1 period2 period3 period4 period5 etc 

Aber ich denke, ich Hinzufügen Dinge neben Klassen sein will wie Aktivitäten nach der Schule und wollte in der Lage sein, leicht zu erweitern, ohne ständig hinzufügen zu müssen Säulen.

Danke für jede Hilfe, die Sie mir geben können.

Antwort

2

Sie können Unterabfragen verwenden, um jede einzeln auszuführen und nur Ergebnisse zu erhalten, bei denen beide Unterabfragen übereinstimmen.

Select StudentId FROM table WHERE 
    StudentId IN 
     (SELECT studentID FROM table WHERE (period = 1 AND class= "math")) 
AND 
    StudentId IN 
     (SELECT studentID FROM table WHERE (period = 2 AND class= "english")) 

Bearbeiten - hinzugefügt

ich das selbst nicht getestet, aber ich war über die Leistung Überlegungen neugierig, so sah ich es auf. Ich fand dieses Zitat:

Viele Transact-SQL-Anweisungen, die umfassen Subqueries alternativ als Joins formuliert werden können. Andere Fragen können nur mit Unterabfragen gestellt werden. In Transact-SQL gibt es normalerweise keinen Leistungsunterschied zwischen einer Anweisung, die eine Unterabfrage und eine semantisch gleichwertige Version enthält, die nicht. Jedoch in einige Fälle, in denen Existenz muss überprüft werden, ergibt eine Verbindung bessere Leistung. Andernfalls muss die verschachtelte -Abfrage für jedes Ergebnis der äußeren Abfrage verarbeitet werden, um die Eliminierung von Duplikaten zu sicherzustellen. In solchen Fällen würde ein Join-Ansatz bessere Ergebnisse liefern. Das Folgende ist ein Beispiel zeigt sowohl eine Unterabfrage SELECT und SELECT verbinden, die die gleiche Ergebnismenge zurück:

hier: http://technet.microsoft.com/en-us/library/ms189575.aspx

+0

Wahr, aber ein bisschen Overkill, nicht wahr?: D aber +1 für ein korrektes Unterabfrage-Beispiel –

+0

Es ist jedoch nicht notwendig, zwei Unterabfragen zu haben - eines kann in der Abfrage auf oberster Ebene zusammengeführt werden. –

+0

@Joe Hopfgartner: was er will, ist INTERSECT, und Davids Ansatz ist die kanonische Formulierung von Schnittpunkt. –

3

versuchen so etwas wie:

select studentid from table where (period = 1 AND class= "math") or (period = 2 AND class = 
"english") group by studentid having count(*) >= 2 

die Idee ist, alle zu wählen, die die ersten Kriterien oder die zweiten Kriterien erfüllen, Gruppe es von Person und sehen, wo alle erfüllt werden, indem die Anzahl der Zeilen Überprüfung gruppiert

2

Sie auch eine Selbst tun könnten beitreten

SELECT t1.studentID 
FROM table t1 
JOIN table t2 ON t1.studentID = t2.studentID 
WHERE (t1.period = 1 AND t1.class= "math")  
    AND (t2.period = 2 AND t2.class = "english") 
+0

+1. Nachdem ich diesen Artikel gefunden hatte, wollte ich ihn als zweite Möglichkeit in meine Antwort aufnehmen, aber Sie haben mich dazu gebracht. Nett! – David