Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Mittelschweres Abfrage-Problem

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von teschu, 14 Juni 2013.

  1. teschu

    teschu Neuer Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden