nntp2http.com
Posting
Suche
Optionen
Hilfe & Kontakt

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