Loop über ein Feld

ESKUEL

Neuer Benutzer
Beiträge
3
Hallo liebes Forum,

ich bin ganz neu hier unterwegs und hoffe ihr könnt mir helfen.

Ich habe eine Tabelle, welches so ungefähr aussieht:

Statustabelle:
Auftrag, Status
123,Offen
123,Rückgemeldet
245,Offen
245,Teilgemeldet

Nun möchte ich alle Aufträge laden, deren Status nicht "Rückgemeldet" ist.

Wenn ich nun aber einfach

select Auftrag from Statustabelle where Status <> "Rückgemeldet"

mache, erhalte ich den Auftrag 123 trotzdem, da ich ja nur jede Position vergleiche und in Position 1 der Auftrag 123 den Status "Offen" hat.

Wie müsste mein Select Statement aussehen, damit ich am Ende nur den Auftrag 245 sehe und das ganze auch noch performant ist. Ich habe schon ein paar Lösungen, aber dazu müsste ich erst die komplette Tabelle laden, was allein schon über 20 Minuten dauert aufgrund der Datenmengen.

Vielen Dank im Voraus für eure Tipps :)
 
Werbung:
Folgendes geht - mit PostgreSQL:

Code:
test=*# select * from eskuel ;
 auftrag |  status   
---------+--------------
  123 | offen
  123 | rückgemeldet
  245 | offen
  245 | teilgemeldet
(4 Zeilen)

test=*# with tmp as (select auftrag, array_agg(status) as status from eskuel group by auftrag) select * from tmp where status @> array['rückgemeldet'];
 auftrag |  status   
---------+----------------------
  123 | {offen,rückgemeldet}
(1 Zeile)

test=*# with tmp as (select auftrag, array_agg(status) as status from eskuel group by auftrag) select * from tmp where not status @> array['rückgemeldet'];
 auftrag |  status   
---------+----------------------
  245 | {offen,teilgemeldet}
(1 Zeile)

test=*#

Die Idee ist, ein Array der Statuse je Auftrag zu machen, und darin zu suchen. Das wird aber M$SQL so nicht 1:1 gleich bringen, aber vielleicht hilft es ja schon mal ein Stück weiter ...
 
Wieso hat ein Auftrag mehrere Stati? Ich würde die Historie auslagern oder einen Timestamp aufnehmen und dann die neuesten Stati pro Auftrag ausgeben und filtern.
 
Code:
test=*# select distinct auftrag from eskuel where auftrag not in (select auftrag from eskuel where status = 'rückgemeldet');
 auftrag
---------
  245
(1 Zeile)

test=*#

@Dukel: weil man vielleicht einen Überblick haben möchte, wann welcher Status erreicht war?
 
Code:
test=*# select distinct auftrag from eskuel where auftrag not in (select auftrag from eskuel where status = 'rückgemeldet');
auftrag
---------
  245
(1 Zeile)

test=*#

@Dukel: weil man vielleicht einen Überblick haben möchte, wann welcher Status erreicht war?

Danke für alle Rückmeldungen, das ging ja richtig schnell. Diese Lösung hat mir am besten geholfen, welches ich auch auf Anhieb verstehe. :)

Vielen lieben Dank nochmals an alle. Wieso nur bin ich nicht früher schon auf diese Seite gestoßen, werde euch in Zukunft öfter nerven. :)

Schönen Abend noch
 
Werbung:
Zurück
Oben