Distinct als Lösung

Kampfgummibaerlie

Datenbank-Guru
Beiträge
743
Ersteinmal hier die Code-Zeile:

Code:
select distinct produktgruppen.id, produktgruppen.name from view_produkte inner join 
produktgruppen on (view_produkte.produktgruppe = produktgruppen.id) where maxzahl > 0;

Erklärung dazu:
Mein Wille war es, nur die Werte aus einer Tabelle darzustellen, wo wiederum in einer View öfter vorkommen, nur einmal anzuzeigen und nach momentanem Lagerstand mindestens 1 Stück "zur Verfügung" steht.
Ich arbeite an der Homepage, wie immer xD gut Ding braucht Weile :X ....
Meine Absicht ist es, nach Produktgruppen zu filtern, via einer Dropdown-List, was alles eher PHP ist, aber die SQL-Abfrage die Optionen im select abfragt.

In der View "view_produkte" werden diverse mögliche Produkte aus diversen Stoffen und dem entsprechenden Schnittmuster möglich sind.
Maxstück ist eine simple Division von der Stoffmenge dividiert durch die benötigte Stoffmenge für das Schnittmuster, demnach berechne ich die max. verkaufbaren Stück.

In der Tabelle Produktgruppen ist lediglich der Name und eine ID vorhanden...

Kann man 1:1 meine Abfrage irgendwie schöner darstellen?

Warum meine Lösung so?:
Ich hatte das Problem, dass die Produktgruppen (Namen) öfters als nur einmal dargestellt wurden, falls mehrere Schnittmuster zB eine Haube als Produktgruppe hatten.

Ich bin verbflüfft, wie "einfach" es simpel mit distinct ist, aber ich habe den Gedanken, dass ich (Aufgrund irgendeiner Wissenslücke) einen wichtigen Faktor bisher noch nicht erfahren habe.

Ich bin derzeit wieder sehr motiviert, und frage mich, ob ich nicht ein wenig bremsen sollte, weil ich ja doch nicht hineinsteige, sondern, um ehrlich zu sein hineinhechte und dann nichtmehr bremsen kann, weil der Sprung bereits passiert ist (Sprich ich bereits eine Person als rettende Hand brauche).

Habe das schon im privaten Leben ein bisschen diskutiert und da kam eher was raus wie "Solange es dir Spaß macht", um es kurz zu fassen.
 
Werbung:
Ich mag diese Lösung nicht, und sie scheitert sobald Du Spalten hast die sich einem DISTINCT verweigern (bytea, json). Das "multiplizieren" der Produkte durch den JOIN kannst Du vermeiden, indem Du eine EXISTS Bedingung verwendest:

Code:
select produktgruppen.id, produktgruppen.name 
from view_produkte 
where exists (select * 
              from produktgruppen 
              where view_produkte.produktgruppe = produktgruppen.id)
  and maxzahl > 0;
 
und wieder ein neues Thema für mich, habe ich zwar schon öfters gehört, aber bisher glaube ich keine Erfahrung mit json oder bytea dateien machen dürfen...

Sollte ich mich damit auseinandersetzen, weil das im Team besonders wichtig ist, oder so?
Habe bisher nur Datenbanken von 0 an weg quasi "selbst" geschrieben ... :/

das mit dem exists operator habe ich in der Schule irgendwann gemacht, sprich distinct auf jeden Fall versuchen zu vermeiden, oder gibt es fälle, wo distinct sinnvoller/besser ist als der exists operator?
 
<"Distinct" als Lösung> erinnert mich etwas an "Alkohol ist kein Lösung", sprachlich und inhaltlich. ;-)

In einem RDBMS ist es natürlich so, dass alles darum geht, eindeutig Datensätze addressieren zu können.
Spricht man von Distinct, als Mittel, Eindeutigkeit zu erreichen, so bedeutet das implizit:
Die abgefragte Menge enthält keine Primärschlüssel Spalte (sonst wäre sie eindeutig und distinct nicht nötig)

Anders ausgedrückt, was durch Distinct "repariert" werden kann, riecht nach schlampiger Selektion oder falschem Datenmodell.
Ich selektier ein wenig durch die Gegend und mach dann noch ein Distinct Pflaster drauf.

Es gibt sicher viele Fälle, wo ein Distinct unverzichtbar ist (oder Distinct Alternativen), aber bevor ich es einsetze, frage ich mich, warum meine Select Statements nicht von allein und garantiert Distinct sind.
 
Ich hoffe mal maxanzahl kommt aus der View, dann ist eine berechnete Spalte ok. >Verwende trotzdem immer voll qualifizierte Spaltennamen, vor allem da wir ja das Ausgangsmaterial nicht kennen.
 
Werbung:
Maxanzahl ist bei mir in der Ansicht einfach die Stoffmenge aus der Tabelle Stoffe dividiert durch die Stoffmenge in der Tabelle Schnittmuster ;)

Schnelles Beispiel:
Wir haben 4 Meter rote Baumwolle
Wir haben 1 Schnittmuster welches 1,5 Meter Baumwolle braucht
Dann steht in der view 2, weil ich abrunde, damit der Kunde nicht mehr Stück bestellen kann, as Stoffe auf Lager sind

Ausganggsmaterial:
2xNumeric

Ergebnis:
Integer (Ceil)

Habe den Kopf gerade ganz wo anders... habe auf den Rat von irgendjemand gehört, und irgendwie den pg_cluster gecrashed, habe bisher bereits pgsql gepurged und neu installiert sowie konfiguriert. problem ist jetzt, ich finde kein backup -_-

sollte ich, falls ich das wirklich komplett problemlos aus dokumenten und so weiter flüssig laufen lassen möchte das ganze ernsthaft so langsam wie möglich angehen? Sprich auch zufrieden sein mit Teilarbeiten, auch wenn ich diese bereits mehr oder weniger aus dem Ärmel schüttle...

Ich glaube ich habe den Ansporn nach mir, aber mache immer irgendwo minimale Fehler und muss von vorne anfangen, weil der kleine Fehler im Endeffekt doch wegen meiner Wissenslücken mich dazu bringt, von vorne zu beginnen.

Aber ja, ich habe ja Spaß am Tippen xD

Werde mal eine Pause einlegen mit dem Ganzen und mir alles nötige vorbereiten, damit das Ganze professionell mit Schritt für Schritt dokumentiert wird und was weiß ich was allem.

Anhang: Jaa.. :( ich habe zuviel Freizeit, sage ich einmal...
 
Zurück
Oben