Größten zugehörigen Wert ermitteln

elbino

Grünschnabel
Hallo,

ich komme gerade bei einer SQL-Abfrage nicht weiter. Und zwar brauche ich aus einer Spalte nicht den größten Wert, sondern den jeweils größten Wert, der zu einem anderen Wert zugordnet ist. Das Ganze soll im WHERE-Teil abgefragt werden, soll also nicht das Suchergebnis geben.

Als Verdeutlichung:

Tabelle 1: TEXT

Spalte 1: Text_ID (PK)
Spalte 2: Text
...

Tabelle 2: TEXTVERSION

Spalte 1: Versions_ID (PK)
Spalte 2: Text_ID (PK) (FK)
Spalte 3: Versionstext
...

Wie kann ich nun im Bedingungsteil der Abfrage dafür sorgen, dass nur Datensätze herausgesucht werden, bei denen zu jeder Text_ID nur die jeweils NEUSTE Version (durch die Versions_ID als Zahlenwert) ausgewählt wird?

Vielen Dank schon mal im Voraus!

Gruß,
Thomas
 
Ah ja, okay. Danke schön. Da hatte ich wohl ein Brett vorm Kopf. :eek:) Wenn ich MAX() im WHERE Teil verwende, dann müsste es ja problemlos gehen. *g* Oder bin ich da auf dem Holzweg?

Gruß,
Thomas
 
Zuletzt bearbeitet:
Ne, ist schon richtig. Mit dem JOIN verknüpfst du die Tabellen und mit WHERE Versions_id = MAX(Versions_id) erhältst du nur den höchsten Wert. Alternativ per Unterabfrage, falls du die GROUP BY Klausel verwenden musst (einfach ausprobieren).
 
Hallo noch mal,

ich hab das mal testhalber in Access ausprobiert. Da meckert der mir aber rum, dass diese Aggregatfunktion (also Versions_ID = MAX(Versions_ID)) in der WHERE Klausel nicht verwendet werden darf.

EDIT:

Okay, das liegt an Access, hab ich festgestellt. *g* Hat sich erledigt.
Allerdings gibt mit die Verwendung des Ausdrucks MAX nur genau einen Datensatz zurück. Ich will aber zu jeder Text_ID genau einen Datensatz mit der jeweils größten Versions_ID. Hach, ist das verzwickt. Hast du vielleicht noch einen Tipp diesbezüglich? Danke schon mal!
 
Zuletzt bearbeitet:
Oje, ich hab jetzt die ganze Zeit daran rumprobiert und bekomme es nicht hin. Wenn ich das MAX() hinter WHERE verwende, dann bekomme ich nur einen Datensatz zurück, nämlich den mit der maximalen Versionsnummer. Aber ich will doch mehrere Datensätze haben.

Meine SQL Abfrage lautet bisher:

SELECT Texttab.Textname, Tabellenversion.Textteil, Tabellenversion.Textvers, TextTab.Text_ID
FROM Texttab, Tabellenversion
WHERE Texttab.Text_ID = Tabellenversion.Text_ID AND Tabellenversion.Textvers = (SELECT MAX(Tabellenversion.Textvers) FROM Tabellenversion);

Die Unterabfrage musste sein, weil Access das sonst nicht anders akzeptiert. Zur Verdeutlichung: Die Abfrage soll die Datensätze mit der größten (also neusten) Versionsnummern zu jeder Text_ID anzeigen. Es muss also möglich sein, dass mehrere Datensätze rauskommen.

Kann mir da vielleicht noch mal jemand helfen? Wäre wirklich ganz klasse!

Gruß,
Thomas
 
SQL:
SELECT Texttab.Textname, Tabellenversion.Textteil, Tabellenversion.Textvers, TextTab.Text_ID
FROM Texttab
INNER JOIN Tabellenversion
ON Texttab.Text_ID = Tabellenversion.Text_ID
WHERE Tabellenversion.Textvers = 
(
	SELECT MAX(Tabellenversion.Textvers)
	FROM Tabellenversion
);
Das ist mal die "schönere" Abfrage mit JOIN *g*.

Versuchen wir das ganze mal mit der GROUP BY Klausel:
SQL:
SELECT Texttab.Textname, Tabellenversion.Textteil, MAX(Tabellenversion.Textvers), TextTab.Text_ID
FROM Texttab
JOIN Tabellenversion
ON Texttab.Text_ID = Tabellenversion.Text_ID
GROUP BY Tabellenversion.Text_ID;
Das liefert dir zu jeder Text_ID die höchste Versions_ID.
 
Hallo Radhad,

yeah! Vielen, vielen Dank!! Ich sollte dir eine Torte schicken oder so! :) Bin leider in SQL nicht so bewandert. Die Vorlesung zum Thema gab eben nur Grundwissen her. Echt klasse, dass hier so hilfsbereite und kompetente Leute posten. Das ist hier das beste Forum, das mir seit langer Zeit untergekommen ist!

Viele liebe Grüße,
Thomas
 
SQL Einführungen sind oft ziemlich schwammig. Mir wurde 2 Jahre lang Oracle und immer wieder die Theorie "eingeprügelt" (2 Stunden Vortrag vom Lehrer, 2 Stunden Übungen dazu machen) ;) Seit dem hab ich nen großes Interesse daran :)


Schön dass ich dir helfen konnte!

Gruß Radhad
 
Zurück