Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Doppelte Eintraege - einen davon in Abfrage ausgeben

Begonnen von dfens, Juli 04, 2024, 19:29:57

⏪ vorheriges - nächstes ⏩

dfens

Hallo an die Profis hier,

habe leider wenig Erfahrung mit SQL und wäre über Hilfe froh. Habe das Problem schon runtergebrochen:
Es gibt 2 Tabellen
1) Tabelle "TEST" in der sich Datensätze mit verschiedenen Testszenarios befinden. (2 Felder: TEST_ID und TestNr)
2) Tabelle "EXECUTION", in der die Ausführungen der Tests erfasst werden. (Felder sind EXEC_ID als Prim.Key, Test_ID als Fremdschlüssel zur ersten Tabelle, ExecNr einfach als Ausführungsnummer und ExecStatus - der kann "OK", "stopped" oder "pending" sein

Nun kann es sein, dass z.B. Test Nr. 2 doppelt ausgeführt wird. Dann wird in der EXECUTION tabelle für Test Nr 2 ein Datensatz mit Status "OK" und ein Datensatz z.B. mit Status "stopped" erfasst. Also zwei Datensätze mit gleicher TestNr und gleicher ExecNr. aber unterschiedlichem Status.

Eine Abfrage soll mir nun alle Tests mit dem jeweiligen Status anzeigen - soweit OK.

ABER HIER MEIN PROBLEM:
Falls es einen Test gibt, der einmal den Status "Stopped" und einmal den Status "OK" hat, dann soll nur der Datensatz mit "OK" angezeigt werden. Wenn es keinen datensatz mit "OK" gibt, soll eben nur der mit dem Status "stopped" ausgegeben werden.


Wie kann so eine Abfrage aussehen ??

Das ganze ist nur ein Beispiel - Ich weiß dass zwei gleiche ExexNr hier keinen Sinn ergeben. Aber ich brauch es genau so.

Die Abfrage, die ich bisher habe, sieht wie folgt aus (gibt aber eben alles aus):
SELECT TEST.TEST_ID, TEST.TestNr, EXECUTION.EXEC_ID, EXECUTION.TEST_ID, EXECUTION.ExecNr, EXECUTION.ExecStatus
FROM TEST
LEFT JOIN EXECUTION ON TEST.TEST_ID = EXECUTION.TEST_ID

Ich hoffe die obige Beschreibung ist nicht allzu verwirrend....

Danke schon mal vorab für Eure Hilfe!

PS: Ähmmm... schräg - ich wollte aber kann das Access File hier nicht dranhängen.. (accdb Endung)

MzKlMu

Hallo,
die Datenbank zippen, dann klappt das mit dem Hochladen.
Gruß Klaus

ebs17

SELECT
   SELECT
   T.TEST_ID,
   T.TestNr,
   E.ExecNr,
   E.ExecStatus
FROM
   Test AS T
      LEFT JOIN
         (
            SELECT
               X.TEST_ID,
               X.ExecNr,
               MIN(X.ExecStatus) AS ExecStatus
            FROM
               EXECUTION AS X
            GROUP BY
               X.TEST_ID,
               X.ExecNr
         ) AS E
         ON T.TEST_ID = E.TEST_ID
Mit freundlichem Glück Auf!

Eberhard

dfens

#3
Erstmal Danke für die Antworten.
"Datenbank" ist gezippt und angehängt. Danke für den Tip! Ist vermutlich hilfreicher auch wenns nur zwei kleine Tabellen sind.

EBS17: Was Deinen Code betrifft - ich habs versucht - bin aber kläglich gescheitert. Verstehe ich den Code richtig, dass er im Alphabet den kleinsten Buchstaben suchen soll (also die kleinste ASCII Nummer) und dann nur das ausgibt ?

Evtl. hilft ja jetzt die angehängte DB. Ich wills halt auch verstehen, was der Code macht. Und wenns mal funktioniert, kann ich damit experimentieren ;-)

Was ich versuche zu erreichen:
Nur die grünen Zeilen (Screenshot) sollen in der Abfrage angezeigt werden, da für diejenigen, die den stopped Status haben, auch ein Datensatz mit OK Status existiert.


ebs17

#4
ZitatVerstehe ich den Code richtig, dass er im Alphabet den kleinsten Buchstaben suchen soll (also die kleinste ASCII Nummer) und dann nur das ausgibt ?
Ich sag mal so: Die Zeichenkette "OK" ist kleiner als "Stopped" - alphanumerische Sortierung beginnt mit dem ersten Zeichen, die anderen Zeichen werden dann aber nachgeordnet auch berücksichtigt.

Zusätzliche vorhandene Stati können dann aber ein anderes Bild zeichnen, wenn man sie nicht explizit berücksichtigt.

Dein Lösungsbild widerspricht Deinen bisherigen Beschreibungen: zusätzliches Auftraten von "pending".

Der Fehler in meiner Anweisung liegt darin, dass am Beginn SELECT zweimal vorkommt. Das kann passieren, wenn man Anweisungen per Hand schreibt und mehrere Gedanken gleichzeitig im Kopf hat, und das Ganze ungeprüft (mangels eigener Umgebung dazu) rausgibt. Zum Prüfen ist dann der Anwender zuständig, und einfache Fehler sollte dieser auch selber finden können.

Mit freundlichem Glück Auf!

Eberhard

dfens

Hi Eberhard!

OK - Dann habe ich das Prinzip mit der Sortierung halbwegs verstanden. Danke!

Was den Status "pending" betrifft - das hab ich in meiner ersten Mail im ersten Absatz erwähnt - aber ist kein Thema - jetzt wo ich weiß worauf ich in Sachen sortierung achten muss.

Und das doppelte "SELECT": Ich dachte es ist irgendeine Art Verschachtelung.

Also - ich werde mich nun mal ans Basteln machen.
Besten Dank nochmal !

ebs17

Die Stati sollten eigentlich in einer eigenen Tabelle liegen und per Fremdschlüssel in die andere Tabelle verknüpft sein. Dies birgt die Chance, einen solchen Schlüssel nicht per Autowert zu erzeugen, sondern eigendefiniert z.B. mit 100, 200, 300, ... zur Definierung einer festen Reihenfolge. Schrittweite größer 1 ermöglicht das einfache nachträgliche Einfügen zusätzlicher Werte. Wenn man den ersten Status mit der niedersten Zahl versieht, kann man dann einfach per MAX(FK) ermitteln, wie weit der Bearbeitungsstand fortgeschritten ist und Abfrageaufwand an der Stelle niedrig halten.
Mit freundlichem Glück Auf!

Eberhard