Select befehl

folgendes probelm:

suche einen select befehl für folgendes access problem:

ich habe eine tabelle in der sind die materialnummer doppelt belegt, der einzige unterschied ist das datum.
will nun das ergebnis so einschränken das es die materialnummer mit dem neuern datum ausgibt.

im voraus besten dank

pierre

z.B. über ein Subselect:

select materialnummer, datum
 from material a 
 where exists (select 'X' 
 from material b
 where b.materialnummer=a.materialnummer
 and b.datum 
Gruß

J.


> <small>[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]</small>

Die Idee mit dem Subselect ist gut, aber der angeführte Select leider falsch. Obiger select liefert alle Materialnummer, für die es eine gleiche mit älterem Datum gibt. Er läßt also alle Sätze unter den Tisch fallen, für die es nur ein Datum gibt. Außerdem liefert er alle Materialnummern, die öfter als zwei mal gespeichert sind (n-1) mal.
Hier mein Vorschlag:

select materialnummer, datum 
from material a 
where datum = 
 (select max(datum) from material b
 where b.materialnummer = a.materialnummer);

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

1 Like

ich habe eine tabelle in der sind die materialnummer doppelt
belegt, der einzige unterschied ist das datum.
will nun das ergebnis so einschränken das es die
materialnummer mit dem neuern datum ausgibt.

z.B. über ein Subselect:

select materialnummer, datum
from material a
where exists (select ‚X‘
from material b
where b.materialnummer=a.materialnummer
and b.datum
Gruß

J.

der angeführte Select
leider falsch.

Sehe ich nicht so, denn…

Obiger select liefert alle Materialnummer, für
die es eine gleiche mit älterem Datum gibt.

Stimmt.

Er läßt also alle
Sätze unter den Tisch fallen, für die es nur ein Datum gibt.

Laut Aufgabenstellung gibt es keine.

Außerdem liefert er alle Materialnummern, die öfter als zwei
mal gespeichert sind (n-1) mal.

Ebenso

Hier mein Vorschlag:

select materialnummer, datum
from material a
where datum =
(select max(datum) from material b
where b.materialnummer = a.materialnummer);

OK, der ist besser. Keep hacking :smile:

Gruß

J.

und unter Oracle …
… wäre es doch wahrscheinlich wie folgt am besten (???) :

SELECT materialnummer, datum
FROM material
WHERE (datum, materialnummer) =
(SELECT max(datum), materialnummer
FROM material
GROUP BY materialnummer);

imho:
Kein Join und deshalb bessere Performanz.

Fragender Gruß von JSTefan

Im Prinzip hast Du recht, aber nur wenn datum/materialnummer zumindest ein unique key ist. Und dann ist es noch nicht sicher, es kommt nämlich darauf an, wie sich die DB konkret entscheidet zu lesen.

Ab hier wird´s Oracle-spezifisch:

Was im speziellen Fall günstiger ist, erfährst Du, wenn Du einen "explain plan for " machst. Davor sollte der Optimizer so eingestellt werden, wie Du´s dann auch aus der Anwendung brauchst. Und ein regelmäßiger analyze_schema darf ohnehin nicht vergessen werden. Wenn die Ausgangslage nämlich so ist, daß es mit Sicherheit immer genau zwei Sätze zu einer Materialnummer gibt, könnte unter Umständen auch die erste vorgeschlagene Lösung die günstigste sein.

Wenn das verwirrend war, gebe ich gerne weitere Auskünfte.

Gruß aus Wien,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

der angeführte Select
leider falsch.

Sehe ich nicht so, denn…

Obiger select liefert alle Materialnummer, für
die es eine gleiche mit älterem Datum gibt.

Stimmt.

Er läßt also alle
Sätze unter den Tisch fallen, für die es nur ein Datum gibt.

Laut Aufgabenstellung gibt es keine.

Außerdem liefert er alle Materialnummern, die öfter als zwei
mal gespeichert sind (n-1) mal.

Ebenso

Hast recht, sorry, daß ich Dich hier zu Unrecht verunglimpft hab´.

Hier mein Vorschlag:

select materialnummer, datum
from material a
where datum =
(select max(datum) from material b
where b.materialnummer = a.materialnummer);

OK, der ist besser. Keep hacking :smile:

Muß nicht unbedingt besser sein, er schränkt nur die Ausgangssituation nicht so stark ein (funktioniert für beliebig viele Sätze zu einer Materialnr., Deiner eben nur für genau zwei)

Gruß

J.

Auch Gruß, und nicht bös sein bitte, wenn ich da ein bisschen vorschnell war,

Martin