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
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