Das war auch mein Gedanke. Letztlich von meiner ersten Lösung gestern nicht allzuweit entfernt, jedoch sind die Sub-Selects in dieser Variante nun erheblich leichter nachvollziehbar, so dass man da ggf. auch nach ein paar Monaten noch heruasfinden kann, was da überbaupt gemacht wird. Das war letzlich auch das Ziel meiner Frage: Funktionierende Lösung, die etwas weniger verworren ist, als das was ich da produziert hab
Stand:
SQL-Code:
SELECT x.behnr, x.name FROM
(SELECT a.rohstoff, a.behnr, a.name FROM
(SELECT b1.rohstoff, b2.behnr, b2.name FROM qundz qz
JOIN beh b1 ON b1.behnr=qz.quelle
JOIN beh b2 ON b2.behnr=qz.ziel
JOIN rohstoffe rs ON b1.rohstoff=rs.rnummer) a
INNER JOIN
(SELECT rohstoff FROM rezpos WHERE reznr=:rn AND typ=1) b
USING (rohstoff)) x
GROUP BY
x.behnr
HAVING
COUNT(x.behnr) >= (SELECT COUNT(*) FROM rezpos WHERE reznr=:rn AND typ=1)
">=", weil ich noch nicht weiss, ob ggf. später mehrere Quellbehälter auf ein und dem selben Ziel den selben Rohstoff beinhalten können. Es kann also auch mehr Quellen als Rohstoffe im Rezept geben, was denke ich durch das >= (statt =) behandelt sein sollte.
Zu vormals:
SQL-Code:
SELECT k.ziel, e.name FROM
(SELECT COUNT(*) qcount, z.ziel FROM
(SELECT p.id, q.ziel FROM beh b
JOIN (SELECT id, rohstoff FROM rezpos WHERE reznr=:rn AND typ=1) p ON b.rohstoff = p.rohstoff
JOIN qundz q ON b.behnr = q.quelle) z
GROUP BY z.ziel) k
JOIN (SELECT COUNT(id) mcount FROM rezpos WHERE reznr=:rn AND typ=1) m
JOIN beh e ON k.ziel=e.behnr
WHERE mcount<=qcount
Das Ergebnis scheint gleich zu sein, und auch wenn die neue Variante länger ist, finde ich sie doch weit eingängiger. Die Mechanismen dürften bei beidem aber am Ende doch recht ähnlich sein, und wenn auch ihr intuitiv nicht zu einem Einzeiler kommt, bin ich jetzt zumindest davon überzeugt, dass ich das Problem deutlich unterschätzt habe
Besten Dank!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)