Mittelschweres Abfrage-Problem

teschu

Neuer Benutzer
Beiträge
1
Moin,

ich habe folgendes Problem mit einer Datenbank bzw. SQL-Abfrage:

- In einer Auftragstabelle wird ein Auftrag angelegt, sobald eine Bestellung eingegangen ist
- Der neue Datensatz erhält eine AuftragsNummer, die den Vorgang markiert.
- Dabei wird ebenfalls eine 1 in das Feld „Status“ eingetragen wodurch angezeigt wird, dass es sich um eine Bestellung handelt.
- Wird die Bestellung ausgeliefert und entsprechend ein Lieferschein verfasst, so wird ein neuer Datensatz angelegt, der die gleiche AuftragsNummer erhält, wobei in das Feld „Status“ dann eine 2 eingetragen wird (bei Rechnung 3 usw.)
- Ich möchte nun die eindeutige ID eines jeden Datensatzes auslesen, die bis jetzt nur den Status einer Bestellung haben, also alle Datensätze bei denen Status = 1 ist und die keinen über die Auftragsnummer zugeordneten Datensatz haben der ungleich 1 ist.

Ich hatte 3 Ideen, wie das zu lösen sein könnte, von denen aber keine funktioniert hat bzw. von einer kenn ich die Syntax nicht, soweit diese existiert…

Lösungsversuch 1: Daten über ein selfjoin abgleichen

SELECT a.id
FROM Auftrag as a
JOIN Auftrag as b ON a.AuftragsNR = b.AuftragsNr
WHERE a.Status = 1 and not b.Status > 1

Die Lösung funktioniert nicht, da beim Abgleich der a.Datensätze mit den b.Datensätzen auch jeder Datensatz mit sich selbst verglichen wird und sich somit für jede Auftragsnummer immer ein Datensatz findet, bei dem beide Bedingungen erfüllt sind.

Hieraus resultiert meine 2.Lösungsidee, die darin besteht, dass bei dem o. g. Abgleich eines Datensatze mit sich selbst ausgeschlossen wird. Allerdings habe ich keine Vorstellung, wie das syntaktisch machbar ist (wenn überhaupt).

Damit kommen wir zur 3.Lösungsidee: Hierbei wollte ich die Datensätze mit der gleichen Auftragsnummer gruppieren, und die Anzahl der Datensätze mit count(*) erfassen. Das Ergebnis von count wollte ich dann wiederum mit dem Eintrag in Status abgleichen, um so die gewünschten Datensätze zu sondieren, aber leider klappt das auch nicht so richtig …Hier noch die ungefähre Syntax:

SELECT id
FROM Auftrag
GROUP BY AutragsNr
HAVING COUNT(*)=1

Ich hoffe, ich konnte mein irgendwie Problem verständlich und es findet sich jemand, der mir helfen mag…

Ich bin eigentlich ein ziemlicher Anfänger, also bitte bei möglichen Antworten nicht allzuviel Vorwissen voraussetzen. Zudem ist die Datenbasis vorgegeben und nicht veränderbar

Vielen Dank im Voraus und MFG
Tesch
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.846
Ich bin eigentlich ein ziemlicher Anfänger, also bitte bei möglichen Antworten nicht allzuviel Vorwissen voraussetzen. Zudem ist die Datenbasis vorgegeben und nicht veränderbar

Vielen Dank im Voraus und MFG
Tesch

Code:
test=# create table teschu (auftrag int, status int);
CREATE TABLE
Time: 323,391 ms
test=*# copy teschu from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1    1
>> 1    2
>> 2    1
>> 3    1
>> 4    1
>> 4    2
>> \.
 
Time: 0,935 ms
test=*# select auftrag from teschu where status = 1 except select auftrag from teschu where status != 1;
auftrag
---------
      2
      3
(2 rows)
 
Time: 0,325 ms
test=*# select auftrag, count(1) from teschu group by auftrag having count(1) = 1;
auftrag | count
---------+-------
      3 |    1
      2 |    1
(2 rows)

Lösung 1 wird wohl mit Deiner MySQL nicht gehen.

Btw.: Du legst offenbar gleiche Datensätze an, die sich nur im Status unterscheiden. FAIL.
 
Oben