Zeilen mit größter ID je Eintrag ausgeben

So, hier ist mein Problem nochmal in Form einer kleinen Access-Datenbank. Gleich vorweg: Die Tabellen und Spalten haben etwas andere Namen als bisher hier im Thread verwendet, aber die DB enthält eine Abfrage mit allen benötigten Spalten. Vergesst am besten einfach mal alles, was oben geschrieben wurde ;)
Was in der Access-DB anders ist als in SQL Server: Ich mußte alle Felder gruppieren, um das gleiche Ergebnis zu bekommen, das ich in SQL Server ohne Gruppierung bekomme. Falls das keine Eigenheit von Access ist, könnte mir u.U. ein kleiner Fehler beim Datenexport unterlaufen sein. Ich sehe aber nicht, wo.

Bisher ging die Frage darum, die höchste ID (E_ID) pro LFD_NR auszugeben. Jetzt habe ich erkannt, daß es besser wäre, den Datensatz mit dem größten Wert von STAMM_1.AUSF auszugeben (nicht STAMM.AUSF!), weil ich nicht sicher bin, ob E_ID immer aufsteigend vergeben wird.
Der Sinn der zweimaligen Verknüpfung von STAMM ist, über die Tabelle PATH die zu jeder E_ID gehörenden Werte von AUSF zu bekommen. Und davon ist pro LFD_NR jeweils der Datensatz gefragt, der den höchsten Wert enthält. In dem angefügten Screenshot habe ich das mal (bis LFD_NR=60a) markiert, um es zu verdeutlichen.

Die letztendliche Abfrage soll also folgendes machen:
  • Im Ergebnis von Abfrage1 die Zeilen mit gleichem Wert für LFD_NR suchen (rote Rahmen im Screenshot, z.B. "10").
  • In dieser Zeilengruppe diejenige Zeile finden, die in Spalte STAMM_1.AUSF (grüne Rahmen) den höchsten Wert hat. Bei "10" wäre das der Wert 4.
  • Die gefundene Zeile unverändert ausgeben. Im Screenshot sind die Zeilen gelb unterlegt. Zum Schluß möchte ich nur diese gelben Zeilen haben.
Und nur zur Erinnerung: Ich brauche eine Abfrage für SQL Server, nicht für Access :D
 

Anhänge

  • Abfrage.zip
    61,7 KB · Aufrufe: 3
  • Abfrage.jpg
    Abfrage.jpg
    408,3 KB · Aufrufe: 3
Werbung:
Das nenn ich auf jeden Fall mal optimale Testdaten :) Ich komme aber heute nicht mehr dazu, vieleicht morgen. Du kannst auch mit dem SQL Studio auf Access zugreifen, das erleichtert die Sache enorm:
Code:
SELECT    *
FROM    OPENROWSET('Microsoft.Jet.OLEDB.4.0','D:\xxx\xxx.mdb';'admin';'',[tabelle])
 
Ich hab jetzt erstmal versucht dein Abfrageergebnis nach zu bauen, leider kann ich das auf dem Screenshot nicht exakt reproduzieren. Bitte guck doch mal, ob du mit meiner Abfrage das selbe raus bekommst, wie mit deiner Abfrage, und korrigiere mich wenn ich falsch liege. Du kannst sie direkt in SQL ausführen und dabei meine OPENROWSETs (die ich ja nur wegen Access brauche) durch Tabellennamen ersetzen.
Code:
SELECT    STAMM.T_VER_ID AS T_NR,
        STAMM.AUSF AS STAMM_AUSF,
        STAMM.E_ID AS STAMM_E_ID,
        MERKMAL.LFD_NR,
        MERKMAL.SORT_NR,
        MERKMAL.SOLL,
        MERKMAL.OG,
        MERKMAL.UG,
        MERKMAL.AGBL,
        MERKMAL.E_MM_ID,
        MERKMAL.E_ID AS MERKMALE_ID,
        STAMM_1.AUSF AS STAMM_1_AUSF
FROM    OPENROWSET(    'Microsoft.Jet.OLEDB.4.0',
                    'D:\test\Abfrage.mdb';
                    'admin';'',[STAMM]) STAMM,
        OPENROWSET(    'Microsoft.Jet.OLEDB.4.0',
                    'D:\test\Abfrage.mdb';
                    'admin';'',[MERKMAL]) MERKMAL,
        OPENROWSET(    'Microsoft.Jet.OLEDB.4.0',
                    'D:\test\Abfrage.mdb';
                    'admin';'',[PATH]) [PATH],
        OPENROWSET(    'Microsoft.Jet.OLEDB.4.0',
                    'D:\test\Abfrage.mdb';
                    'admin';'',[STAMM]) STAMM_1
WHERE    STAMM.E_ID = MERKMAL.E_ID
AND        STAMM.E_ID = [PATH].E_ID
AND        [PATH].PARENT_E_ID = STAMM_1.E_ID
ORDER BY MERKMAL.LFD_NR
 
Noch ohne deine Abfrage getstet zu haben, fiel mir folgendes auf:
  • Es fehlt die Tabelle T_VER und ihre Verknüpfung zu STAMM
  • In meinen Beispieldaten muß nach T_NR=406996 in T_VER und AUSF=5 in STAMM gefiltert werden
  • STAMM.E_ID darf nicht direkt mit MERKMAL.E_ID verknüpft werden, sonst geht die Historie der Daten verloren oder ist falsch.
  • Die korrekten Verknüpfungen sind:
    T_VER.T_VER_ID=STAMM.T_VER_ID
    STAMM.E_ID=PATH.E_ID
    PATH.PARENT_E_ID=STAMM_1.E_ID
    STAMM_1.E_ID=MERKMAL.E_ID
  • Sortieren solltest du nicht nach LFD_NR, sondern besser primär nach SORT_NR und sekundär nach STAMM_1.AUSF
Warum baust du nicht einfach die Abfrage um, die in der Access-DB enthalten ist? :)
 
Sry ich hab hier nur Access 2003 und das hat mir zunächst nur nen grauen Bildschirm gezeigt, hab die Abfrage nicht gesehen :mad:

Ich korrigiere mal.
 
Code:
SELECT    t1.T_NR,
        t1.STAMM_AUSF,
        t1.STAMM_E_ID,
        t1.LFD_NR,
        t1.SORT_NR,
        max(t3.AUSF) AS STAMM_1_AUSF
FROM    (    SELECT T_VER.T_NR,
                    STAMM.AUSF AS STAMM_AUSF,
                    STAMM.E_ID AS STAMM_E_ID,
                    MERKMAL.LFD_NR,
                    MERKMAL.SORT_NR
            FROM    OPENROWSET(    'Microsoft.Jet.OLEDB.4.0',
                                'D:\test\Abfrage.mdb';
                                'admin';'',[T_VER]) T_VER
            INNER JOIN OPENROWSET(    'Microsoft.Jet.OLEDB.4.0',
                                    'D:\test\Abfrage.mdb';
                                    'admin';'',[STAMM]) STAMM
            ON        T_VER.T_VER_ID = STAMM.T_VER_ID
            INNER JOIN OPENROWSET(    'Microsoft.Jet.OLEDB.4.0',
                                    'D:\test\Abfrage.mdb';
                                    'admin';'',[PATH]) [PATH]
            ON        STAMM.E_ID = [PATH].E_ID
            INNER JOIN OPENROWSET(    'Microsoft.Jet.OLEDB.4.0',
                                    'D:\test\Abfrage.mdb';
                                    'admin';'',[STAMM]) STAMM_1
            ON        [PATH].PARENT_E_ID = STAMM_1.E_ID
            INNER JOIN OPENROWSET(    'Microsoft.Jet.OLEDB.4.0',
                                    'D:\test\Abfrage.mdb';
                                    'admin';'',[MERKMAL]) MERKMAL
            ON        STAMM_1.E_ID = MERKMAL.E_ID
            GROUP BY T_VER.T_NR, STAMM.AUSF, STAMM.E_ID, MERKMAL.LFD_NR, MERKMAL.SORT_NR
            HAVING    T_VER.T_NR = 406996
            AND        STAMM.AUSF = 5 ) t1,
        OPENROWSET(    'Microsoft.Jet.OLEDB.4.0',
                    'D:\test\Abfrage.mdb';
                    'admin';'',[PATH]) t2,
        OPENROWSET(    'Microsoft.Jet.OLEDB.4.0',
                    'D:\test\Abfrage.mdb';
                    'admin';'',[STAMM]) t3
WHERE    t1.STAMM_E_ID = t2.E_ID
AND        t2.PARENT_E_ID = t3.E_ID
GROUP BY t1.T_NR,t1.STAMM_AUSF,t1.STAMM_E_ID,t1.LFD_NR,t1.SORT_NR
ORDER BY T_NR,SORT_NR, STAMM_1_AUSF
Habe jetzt die höchste LFD_NR aus deiner Abfrage ausgegeben. Dazu habe ich versucht, die höchste STAMM_1_AUSF auszugeben. Allerdings fällt es mir sehr schwer, weitere Informationen zu joinen weil mir dazu immer wieder die eindeutigen Schlüssel fehlen bzw. ich auch die ganze Datenstruktur nicht mehr raffe.

Vieleicht hilft es, eine Sicht für deine ursprüngliche Abfrage anzulegen und damit weiter zu arbeiten, das wäre enorm hilfreich. Ich bin aber leider an einem Punkt wo ich nicht mehr durch steige weil ich die Daten nicht verstehe, ich weiss nur, das es geht :)
 
Die Datenstruktur kann ich dir bei Bedarf erklären, daran soll es nicht scheitern. Aber die ist halt nicht so ganz einfach. Was genau ist dir unklar? Auf korrekte Schlüsselvergabe usw. habe ich in der Access-DB übrigens nicht geachtet, aber ich kann dir bei Bedarf jedes Feld erklären. Aber ob das nicht noch mehr verwirrt...? :)

Zum Thema Sichten: Meinst Du eine Sicht in der SQL-Datenbank oder in Access? In der Oiginal-DB will ich keinerlei Änderungen vornehmen. Wie geht es in Access? Und so genau kenne ich mich mit Sichten auch nicht aus. Inwiefern erleichtert das die Sache?

Aber jetzt werde ich erst mal versuchen, deine Abfrage zu testen....
 
Hab es jetzt an der SQL-Datenbank getestet, aber bekomme leider keine Ausgabe. Irgendwo habe ich beim Umschreiben sicher einen Hund eingebaut, aber durch das ständige Gehüpfe zwischen t1, t2 und t3 und all den Aliasen bin ich jetzt auch komplett verwirrt, was wo hingehört und wie heißen muß :confused:
 
Werbung:
Zurück
Oben