Access 97 SQL-Abfrage
Von: christian.kirchhoff@editura.de [Profil]
Datum: 17.02.2009 16:25
Message-ID: <6a8a20b3-7f2b-490c-8e1d-5d25c1a408cd@f20g2000yqg.googlegroups.com>
Newsgroup: de.comp.lang.delphi.datenbanken
Datum: 17.02.2009 16:25
Message-ID: <6a8a20b3-7f2b-490c-8e1d-5d25c1a408cd@f20g2000yqg.googlegroups.com>
Newsgroup: de.comp.lang.delphi.datenbanken
Hallo, ich pflege ein Delphi-6-Projekt, welches mit Access-97-Datenbanken arbeitet. Nun bin ich auf der Suche nach einer Abfrage, die aber - wie ich befürchte - so nicht realisierbar sein wird. Es gibt zwei Haupttabellen, nennen wir sie "Source" und "Dest". Sie stehen in einer m:n-Beziehung zueinander. Die weiteren Felder von "Source" sind nicht wichtig, "Dest" hat ein wichtiges neues Feld "Typ". Eine dritte Tabelle realisiert die Beziehung. Felder von Source: Key: AutoWert ...weitere Felder Felder von Dest: Key: AutoWert Typ: Long Integer ...weitere Felder Felder von Rel: Key: AutoWert SourceKey: Long Integer DestKey: Long Integer Ein DBGrid in der Applikation soll gewisse Felder von Source zeigen, es sollte aber auch sichtbar sein, welche Datensätze aus Source mit mindestens einem Datensatz aus Dest verknüpft sind. Alle Datensätze in Dest haben eine Relation via "Rel" zu mindestens einem Datensatz in Source. Die Abfrage dazu lautete: SELECT DISTINCT Source.Key as [Key], Source.*, Rel.SourceKey FROM [Source] LEFT JOIN [Rel] ON Rel.SourceKey = Source.Key Rel.SourceKey ist entweder leer oder entspricht Source.Key. Dies reichte um zu erkennen, dass ein Datensatz aus Source mit einem Datensatz aus Dest verknüpft ist. Nun gibt es das erwähnte neue Feld "Typ" in Tabelle "Dest". Ich möchte nun weiterhin in dem DBGrid die Tabelle "Source" anzeigen, allerdings möchte ich irgendwie erkennen, ob und mit welche Dest-Typen ein Datensatz aus Source verknüpft ist. Eine Abfrage auch des Feldes Dest.Typ über ein weiters JOIN, und die zusätzliche Gruppierung mit Verwendung von Aggregatfunktionen halte ich für nicht realistisch bzw. hatte ich bei Tests immer wieder Fehlermeldungen: - Wildcards (Source.*) sind in der Feldliste nicht erlaubt - ich muss für jedes Feld eine Aggregatfunktion angeben, sonst gibt es Fehlermeldungen - wenn ich dann nach einem dieser Felder sortiere, gibt es wieder einen Fehler, weil das scheinbar nicht erlaubt ist. Zudem erlaubt Access 97 nur wenige Aggregatfunktionen, ich hätte nur SUM() verwenden können, die erlaubten Werte für Typ hätten dann Zweierpotenzen sein müssen, damit ich aus der Summe die einzelnen Typen herausziehen kann. Also erwäge ich nun, die Ansicht des DBGrids zu optionalisieren, also zeige - dass ein Datensatz aus Source mit keinem oder mit irgendeinem Datensatz aus Dest verknüpft ist (dazu würde die obige Abfrage reichen), oder - dass ein Datensatz mit keinem oder mindestens einem Datensatz des Dest.Typs 1 verknüpft ist, oder - dass ein Datensatz mit keinem oder mindestens einem Datensatz des Dest.Typs 2 verknüpft ist Für die letzten beiden Optionen fehlt mit ein gültiger SQL-Ausdruck. Bei einer Abfrage á la SELECT DISTINCT Source.Key as [Key], Source.*, Rel.SourceKey FROM ([Source] LEFT JOIN [Rel] ON Rel.SourceKey = Source.Key) LEFT JOIN [Dest] ON (Rel.DestKey = Dest.Key AND Dest.Typ=1) werden durch das erste JOIN bereits alle Source/Dest-Relationen aus "Rel" erfasst, unabhängig von Dest.Typ. Es müsste erst einmal Rel reduziert werden auf die Datensätze, die einen Datensatz aus Dest des gewünschten Typs referenzieren, und das Ergebnis müsste dann mit Source geJOINed werden. Ich habe es versucht - erstmal ohne überhaupt nach Typ zu filtern - mit: SELECT DISTINCT Source.Key as [Key], Source.*, Rel.SourceKey FROM ([Dest] LEFT JOIN [Rel] ON Rel.DestKey = Dest.Key) RIGHT JOIN [Source] ON Rel.SourceKey = Source.Key und SELECT DISTINCT Source.Key as [Key], Source.*, Rel.SourceKey FROM [Source] LEFT JOIN ([Rel] RIGHT JOIN [Dest] ON Rel.DestKey = Dest.Key) ON Rel.SourceKey = Source.Key doch Delphi meldet jedesmal einen "Fehler im Abfrageausdruck". Kann mir jemand sagen, wie die Abfrage formuliert werden müsste bzw. ob solch eine Abfrage möglich ist? Viele Grüße, Christian Kirchhoff[ Auf dieses Posting antworten ]
