Fehlende Aggregatfunktionen MAX

Ich bin doch selten ....
Jetzt verstehe ich, ich darf nur 2 Spalten verwenden, nach der einen wird sortiert max() und die 2. ist das Ergebnis.

AngstHab
 
Werbung:
FROM Order.MNr
LEFT JOIN (SELECT max(PostingNo) AS maxPostingNo, ItemNo, TotalQuantity
FROM Journal
GROUP BY ItemNo, TotalQuantity) AS lastPost ON Order.MNr = lastPost.ItemNo

ORA-00905: missing keyword <- Irgendwie ist da der Wurm drin.
Ich würde sagen die Syntax ist schon fast korrekt nur das "Order" natürlich ein Schlüsselwort in TSQL ist und als Tabellennamen oder Alias keine so gute Wahl ist. Wenn du [Order].MNr schreibst müsste es aber gehen.
 
Guten Morgen
Die Aggregatfunktion funzt soweit, hab jetzt auch die Anwendung verstanden bzw. meine Fehler bemerkt.
Noch eine letzte Frage dazu:
Ich habe die 3. Spalte "TotalQuantity" mit Selectet, welche das Ergebnis was ich brauche beinhaltet, wenn ich noch danach gruppiere bekomm ich wieder mehrere Ergebnisse.
Wenn es nicht im "Group BY "steht, bekomm ich ein nettes "bool(false)" zurück!
Muss ich dafür noch ein Subselect basteln?

Mfg AngstHab
 
Nun, welche TotalQuantity brauchst du denn, die wo max(PostingNo) zutrifft? Da fällt mir auch nichts anderes ein als das seperat dazu zu joinen. Ich glaube da hat keine SQL DB eine Funktion für, jedenfalls ist mir keine bekannt.
 
Ja leider. Ist irgendwie komisch eine Funktion zu implementieren, welche nach Größe sortiert aber das selbe nach einem Wert innerhalb mehrer Spalten (Gruppe) nicht zulässt!

Erstmal vielen Dank für die Hilfe.

// Leider muss ich mir da was anderes einfallen lassen, da die Abfrage 1 1/2 Minuten dauert ohne den Wert für TotalQuantity //
// Die DB ist einige GB groß! //

Mfg AngstHab
 
Ist nicht gerade leichte Kost, wenn man sich dahin gehend nicht so auskennt!
Kann man sich das wie ne vTab mit Links zu den benötigten Spalten der verschiedenen Tabellen vorstellen?
Ist der erstellte Index temporär und muss neu erzeugt werden?
Ich in meiner beschränkten Sicht würde es über eine neue Tabelle, welche mit den nötigen Werten gefüllt sind, versuchen.
 
Ich weiss nicht was eine vTab ist, ich bin mir auch nicht sicher wie Oracle da denkt. Aber der Index als solcher ist SQL standard und funktioniert immer gleich, wie ein Inhaltsverzeichnis. Suchst du nach Einträgen mit E guckt er in den Index für die Spalte (über der der Index liegt) und erst dann in die jeweiligen Einträge der Tabelle. Gibt es keinen Index und du suchst alle Einträge die mit E anfangen muss die ganze Tabelle durchsucht werden.

Der Index muss auch nicht neu gebildet werden das macht die DB beim Schreiben von Einträgen. Etwas Geschwindigkeitsverlust beim Schreiben gegen sehr viel Tempo beim Lesen. Der Index sollte den Where Bedingungen deiner Abfrage angepasst sein, also alle Spalten enthalten, die in deiner Where Bedingung stehen.
 
So, hab derweil ein Änderung in meiner Plannung gemacht!
Zieh alle per cron auf eine MySQL-DB auf dem Webserver, mit den Nötigen Einträgen in eine Tabelle. Da ich noch ne ergänzende Datenbank für eine andere Anwendung brauche ist das der bessere Weg. Man weiss ja nicht was das nächste Update der Application welche zur Oracle-DB gehört bringt!
Das drum und dran ist soweit klar.
Jetzt häng ich wieder an der Geschichte mit "max()" oder "where rownum = 1". Beides funktioniert.
Eigentlich müsste ich das Ergebnis "lastPost.PostingNo" nochmal als LEFT JOIN Journal ON ( lastPost.PostingNo = Journal.PostingNo) setzen!
Das funktioniert aber irgendwie nicht.
Irgend eine Idee?

Mfg AngstHab
 
"SELECT daten.*,
journal.PostingNo, journal.ItemNo, journal.TotalQuantity
FROM daten
(SELECT max(PostingNo) AS maxPostingNo, ItemNo
FROM journal
GROUP BY ItemNo) lastPost​
WHERE daten.ItemNo = lastPost.ItemNo";
 
Werbung:
Die kann so nicht funktionieren. Wo ist die journal-Tabelle die journal.PostingNo, journal.ItemNo, journal.TotalQuantity liefert und wie wird hier lastPost gejoint?
 
Zurück
Oben