Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#13

AW: SQL Vereinfachen

  Alt 17. Feb 2012, 12:45
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)
  Mit Zitat antworten Zitat