Jannes: SQL-Formulierung für Teilmenge? gesucht

Hallo zusammen,

vorweg: ich nix wirklich verstehen Datenbanken!

Ich habe hier eine Tabelle zur Verwaltung von Angeboten, Rechnungen etc.
Felder sind:
uid
projektnummer
vorgang
datum
... usw

Datensätze mit selbiger projektnummer können mehrmals vorkommen.
vorgang hat Werte aus der Liste: ANG,AUF,LIE,RNG,MNG

Ich möchte alle Projekte finden in denen entweder ANG und/oder AUF existiert, aber noch kein Datensatz mit vorgang=RNG. Hiervon soll entweder der Datensatz AUF angezeigt werden, oder, falls nicht existent, das ANG mit dem jüngsten Datum.

Ich kann nur einfache Abfragen definieren, wie z.B. "SELECT uid,kundennummer,rngnummer FROM tabelle WHERE zahlungseingang=0;"  ;-)

Zu den Projekten können z.B. nur ein oder mehrere Datensätze mit ANG gespeichert sein,
oder wie oben und zusätzlich ein AUF
und es gibt auch Projekte nur meit einer RNG.  (das sind meine liebsten)

Kann man das in einer SQL-Definition unterbringen? (DB = MS-Access)

Gruss, Jannes

  1. Hi,

    mit korrelierenden Unterabfragen und dem EXISTS Prädikat. Das sollte Access durchaus können

    SELECT   distinct projekt -- und andere distinct spalten
       FROM t1
       WHERE exists(SELECT * FROM t2 WHERE t2.projekt = t1.projekt and (t2.vorgang = 'ANG' OR t2.vorgang = 'AUF')
       AND not exists(SELECT * FROM t2 WHERE t2.projekt = t1.projekt and (t2.vorgang = 'RNG')

    Die Korrelation erfolgt über die spalte projekt ...

    Mit 2 Joins sollte es auch gehen, ja.

    HTH, Ciao, Frank

    1. Hallo Frank,

      habe die Definition ausprobiert. Habe weitere erforderliche distinct Spalten eingesetzt und fehlende abschliessende Klammern für die exists gesetzt:

      SELECT distinct projekt, vorgang, uid
        FROM t1
        WHERE exists(SELECT * FROM t2 WHERE t2.projekt = t1.projekt and (t2.vorgang = 'ANG' OR t2.vorgang = 'AUF'))
        AND not exists(SELECT * FROM t2 WHERE t2.projekt = t1.projekt and (t2.vorgang = 'RNG'));

      Sieht soweit gut aus. Access befindet die Definition fehlerfrei. Nur wenn ich sie ausführen will, wird die unbekannte Tabelle t2 bemeckert.

      Was/Wo ist die t2?

      Gruss, Jannes

      1. Hallo

        habe die Definition ausprobiert. Habe weitere erforderliche distinct Spalten eingesetzt und fehlende abschliessende Klammern für die exists gesetzt:

          
        SELECT DISTINCT  
            projekt,  
            vorgang,  
            uid  
        FROM  
            <deine tabelle> t1  -- t1 ist ein Aliasname für die Tabelle aus der  
                                -- Du auswählst  
        WHERE EXISTS(  
             SELECT  
                 *  
             FROM  
                 <deine tabelle> t2  -- hier greifst Du doch auf die gleiche Tabelle  
                                     -- zu, daher musst Du einen anderen Aliasnamen  
                                     -- wählen, damit in der WHERE-Klausel Klarheit  
                                     -- herrscht, was mit wem verglichen wird.  
             WHERE  
                 t2.projekt = t1.projekt  
             AND (t2.vorgang = 'ANG' OR t2.vorgang = 'AUF')  
          )  
          -- [...]  
        
        

        Sieht soweit gut aus. Access befindet die Definition fehlerfrei. Nur wenn ich sie ausführen will, wird die unbekannte Tabelle t2 bemeckert.

        Was/Wo ist die t2?

        Ein Aliasname für Deine Tabelle.

        Bei Access habe ich in der Tat noch nicht ausprobiert, ob die Jet-Engine Kommentare versteht.

        Freundliche Grüße

        Vinzenz

        1. Hi Vinzenz,

          Was/Wo ist die t2?

          Ein Aliasname für Deine Tabelle.

          =:) Supi! Jetzt geht's.

          Bei Access habe ich in der Tat noch nicht ausprobiert, ob die Jet-Engine Kommentare versteht.

          Bei mir nicht, wie es scheint

          Gruss, Jannes