Hi Heike,
Aus dieser Tabelle
-----+----------
id | farbe
-----+----------
12 | rot
15 | rot
12 | blau
13 | blau
15 | grün
möchte ich alle ids haben, die rot und blau sind!
Für ein wenig erhellendes Licht wäre ich sehr dankbar ;-)
ich würde an die Sache mit einem JOIN der Tabelle gegen sich selbst heran gehen, also etwa:
select a.id from t as a, t as b where a.farbe='rot' and b.farbe='blau' and a.id=b.id;
Die Idee ist, daß der JOIN eine temporäre Tabelle erzeugt, welche vier Spalten hat: a.id, b.id, a.farbe und b.farbe. Schlimmstenfalls hast Du bei 5 Einträgen dann 25 Zeilen in dieser Tabelle; wenn der Query Optimizer die WHERE-Klausel in der angegebenen Reihenfolge auswertet (also zuerst projeziert und dann ausmultipliziert), dann sind es in Deinem Fall noch 4 (nämlich [a.id,b.id] = [12,12], [12,13], [15,12] und [15,12]). Letzeres könntest Du ggf. durch Indexe auf der "farbe"-Spalte fördern - dann machst Du es dem RDBMS leichter, die entsprechenden Teilmengen effizient zu berechnen.
Von diesen Zeilen sucht er dann diejenigen aus, bei denen die beiden ids übereinstimmen - das ist dann nur noch eine einzige Zeile [12,12]. Und von dieser wählt die SELECT-Klausel zuletzt die erste Spalte aus (die zweite hätte es natürlich auch getan) - that's it.
Ich bin mir nicht sicher, ob die GROUP-BY-Methode von Alexander nicht doch performanter ist. Mein Ansatz ist allerdings der universellere, denke ich.
Außerdem läßt sich mein JOIN sicherlich irgendwie kürzer schreiben (INNER JOIN? Jedenfalls kann man das "a.id=b.id" irgendwie impliziter ausdrücken).
Viele Grüße
Michael
--
T'Pol: I apologize if I acted inappropriately.
V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.