Nur diejenigen Datensätze, deren ForeignKey-Datensätze allesamt in Liste vorkommen

Hallo miteinander,

ich habe ein zwei Tabellen, die über eine ManyToMany-Relation miteinander verknüft sind: Rezepten sind mehrere Zutaten zugeordnet. Jetzt möchte ich bei einer Liste aus Zutaten, die ich als Benutzereingabe erhalte, diejenigen Rezepte, deren Zutaten allesamt in dieser Liste enthalten sind. Ich möchte nicht die Rezepte, die zusätzlich mit Zutaten, welche nicht in der Liste auftauchen, verknüpft sind.

Ich habe mich in der Dokumentation umgesehen, speziell im Bereich “Row and Array Comparisons”, und dachte dabei stets an etwas in der folgenden Art (was natürlich nicht funktioniert):

… WHERE IN (3445,234,534,234, 3434) ALL (SELECT zutaten.id FROM zutaten WHERE zutaten.rezept_id = rezepte.id)

Habe ich mein Problem hinreichend geschildert und könnt ihr mir weiterhelfen?
Vielen Dank im Voraus

jnns



test=# select * from zutaten ;
  zutat
---------
 mehl
 zucker
 salz
 butter
 rosinen
 ei
 pfeffer
(7 Zeilen)

Zeit: 0,155 ms
test=*# select * from rezept;
 rezept
--------
 kuchen
 rührei
(2 Zeilen)

Zeit: 0,222 ms
test=*# select * from rezept_zutat ;
 rezept | zutat
--------+-------
 rührei | ei
 rührei | salz
 kuchen | ei
 kuchen | mehl
(4 Zeilen)

Zeit: 0,233 ms
test=*# select distinct rz.rezept from rezept_zutat rz where zutat in ('ei', 'salz') except select r.rezept from rezept r left join rezept_zutat rz on r.rezept=rz.rezept where rz.zutat not in ('ei', 'salz');
 rezept
--------
 rührei
(1 Zeile)

Zeit: 0,491 ms

Mahlzeit!

Vielen Dank!

Ich habe mir jetzt schon so lange den Kopf über diesem Problem zermatert, auf EXCEPT bin ich nicht gekommen.

Ja, EXCEPT ist recht nützlich …


Andreas