Oracle 7.3.4 Bereichs Abfrage

Hallo! Folgendes Problem:
Ich habe eine Tabelle chargen, in der es die Spalten

Column Name Null? Type


ART NOT NULL NUMBER(2)
ZC VARCHAR2(5)
DATUM NOT NULL DATE
DURCHGEFUEHRTVON NUMBER(3)
ALTECHARGENNUMMER VARCHAR2(30)
LETZTEABNAHMENUMMER VARCHAR2(16)
NEUECHARGENNUMMER VARCHAR2(30)
ERSTEABNAHMENUMMER VARCHAR2(16)

gibt. Ich brauche nun eine Abfrage, in der ich irgendeine Abnahmenummer eingebe und mir die charge, die für den Bereich gültig war, angezeigt wird.

ART ZC DATUM DURCHGEF ALTECHARGENNUMMER LETZTEABNAHMENUM NEUECHARGENNUMMER ERSTEABNAHMENUMM


5 981 08-NOV-04 70 04GXVG06A9 0295489 04I08A10 0295490
3 981 16-NOV-04 9 A04EBGHJ31240 0296874 A04F22098 0296875
4 981 16-NOV-04 9 A04EGBNH31240 0296874 A04F22098 0296875
4 981 26-NOV-04 62 A04F22098 0298650 A04F22099 0298651

d.h. wenn ich die Abnahmenummer 0298651 für die ART 4 anfrage, soll mir die Chargenummer A04F22099 angezeigt werden; Bei der Abnahmenummer 0298600 soll die A04F22098 angezeigt werden Wie kann ich in Oracle 7.3.4 so eine „Bereichsabfrage“ erstellen? Ich friemel mir schon nen Wolf und komm mit ‚>‘, ‚=‘ und ’

Hi Puhbear,

was hast Du gegen „where letzteabnahmenummer = ‚0298651‘“?

Der Tabellenaufbau und die Spaltennamen verwirren mich allerdings etwas. Wieso ist „letzteabnahmenummer“ die kleinere und „ersteabnahmenummer“ die grössere?

Viele Grüße
Bonsai

Hallo,

das übliche Problem. Die Antwort lautet „42“. Wie ist die Frage :wink:.
Eine Bereichsabfrage macht man normalerweise mit „Between“. Das nützt Dir hier aber nichts, wenn ich das Problem richtig verstehe.

Deine Tabelle ist tatsächlich etwas merkwürdig.

Abnahmenummer 0298600 soll die A04F22098 angezeigt werden

Ich weiß nicht, wo du eine „0298600“ finden willst. Oder meintest Du 0298650?
Versuch doch mal zu formulieren, was die genaue Aufgabenstellung ist.
Falls es das ist, was ich vermute, versuchs für den Anfang mit einem union:

select art, altechargennummer, letzteabnahmenummer from chargen union
select art, neuechargennummer, ersteabnahmenummer from chargen

Dieses Select kannst Du auch in eine View packen (und diese dann abfragen), denn

select from (select ...)

geht vermutlich unter 7.3.4 noch nicht, oder? Ist schon zu lange her…

Gruß, Uwe

Hallo!
OK, ich gebe mir Mühe, die Verwirrung komplett zu machen.
Die Tätigkeit, die hinter der Anwendung (zu die diese Tabelle gehört) steckt ist wie folgt:
Es wird ein Infusionsbeutel Produziert, in dem Bestandteile der charge 123 sind. Die letzte Abnahmenummer (oder besser: Beutelnummer) ist die Nummer des letzten Beutels, der mit den Materialien der Charge 123 befüllt wurde. Die neue Abnahmenummer (oder besser: Beutelnummer) ist die Nummer des Beutels, der als erstes mit der neuen Charge (124) befüllt wurde.
Deshalb ist die letzte „Beutelnummer“ logischer weise kleiner als die „Neuebeutelnummer“.
Nun brauche ich einfach eine Abfrage die mir die Chargennummer ausgibt, wenn ich nach einer Abnahmenummer (oder besser: Beutelnummer) suche.

Ich versuche das auch nochmal zu verdeutichen:

ART ALTCH LETZTEAB NEUECH ERSTEAB

5 A100 1000 B200 1001
3 B200 1199 D300 1200
4 D300 1399 F400 1400
4 F400 1599 I500 1600

Blöd ist, dass sich die Tabelle immer verschiebt! Erklärung der ersten Zeile:
ART = 5
ALTCH = A100
LETZTEAB = 1000
NEUECH = B200
ERSTEAB = 1001

Wenn ich nun in der Abfrage die Abnamenummer 1001 eingebe, soll mir die für diese Abnahmenummer gültige chargennummer B200 ausgegeben werden.
Wenn ich nun in der Abfrage die Abnamenummer 1100 eingebe, soll mir die für diese Abnahmenummer gültige chargennummer B200 ausgegeben werden.
Wenn ich nun in der Abfrage die Abnamenummer 1201 eingebe, soll mir die für diese Abnahmenummer gültige chargennummer D300 ausgegeben werden.
Wenn ich nun in der Abfrage die Abnamenummer 1399 eingebe, soll mir die für diese Abnahmenummer gültige chargennummer D300 ausgegeben werden.
Wenn ich nun in der Abfrage die Abnamenummer 1600 eingebe, soll mir die für diese Abnahmenummer gültige chargennummer I500 ausgegeben werden.

Iss nun alles klar? :wink:)

Ich möchte mich ganz herzlich für Eure Ausdauer mit meinem Problem bedanken!!!

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

Hallo Puhbear,

Ok, vergiss meine erste Antwort und nimm diese hier :smile:

Habe ich schon gefragt, wer sich diese Tabelle hat einfallen lassen? Die macht
einem das Leben nicht leicht. Also, die Chargenverwendung zu den Artikeln ist
nicht wirklich optimal modelliert, möchte ich anmerken. Aber…egal…laß es
mich mal so versuchen:

Wennn ich es recht verstanden habe, enthält jede Art(ikel)-Zeile eine
Chargennummer ALT, die bis zu einer bestimmten Abnahmenummer (LETZTEAB)
verwendet wurde. Ab ERSTEAB (=LETZTEAB+1, sinnvollerweise, sonst gibts Lücken?)
wird die NEUECH verwendet.

D.h. wenn eine Charge interessiert, dann steht sie entweder in einer Zeile, weil
da der Bereich der Abnahmenummern (ERSTEAB) beginnt, oder in einer anderen
Zeile, weil da der Bereich der Abnahmenummern (LETZTEAB) endet.

Ergo muß man diese beiden Zeilen in der Abfrage von-bis zusammen betrachten.

Das würde nun prinzipiell schonmal so funktionieren:

select a.neuech, b.altch
 from TABELLE a
 , TABELLE b
 where WERT between a.ersteab and b.letzteab
 and a.neuech = b.altch

Allerdings…sobald Du an die oberen oder unteren Grenzen der Bereich stößt,
klappt das nicht mehr. Also, in Deinem Beispiel die Frage nach „1600“, da dieser
Bereich „nach oben“ offen ist und somit der "select *
from (select a.neuech as chnr, a.ersteab as von, b.letzteab as bis
from TABELLE a
, TABELLE b
where a.neuech = b.altch
union
select neuech, ersteab, 99999
from TABELLE
where neuech not in (select altch
from TABELLE)
union
select altch, 0, letzteab
from TABELLE
where altch not in (select neuech
from TABELLE)
)
where WERT between von and bis

So…ich hoffe, dass das:

  1. Verständlich und
  2. Richtig war :smile:

Wenn nicht, kannst mir ja ein paar von den Infusionsbeuteln zukommen lassen, mir egal, was da drin ist :wink:

Gruß
Bonsai