SQL statement: Mehrere Spalten anzeigen, dabei doppelte Einträge einer (!) Spalte ausblenden

Jo Felsen

Benutzer
Beiträge
6
Hallo Forum,
meine SQL-Kenntnisse sind 0,0.
Ich habe eine mdb mit mehreren Spalten. Die Spalte F7 soll definieren, welche Zeilen angezeigt werden. Unter anderem sollen auch doppelte Einträge dieser Definitionsspalte ausgeblendet werden.
Wenn ich eine einfache SELECT DISTINCT-Anweisung verwende, dann bekomme ich nur eine Spalte:

SELECT Distinct F7 from Query where F7 like '[a-z][a-z]*' order by F7

Wenn ich mehrere Spalten einblende, kann ich das DISTINCT nicht mehr verwenden:

SELECT Query.[F2], Query.[F3], Query.[F7], Query.[F8] FROM Query
WHERE F7 like '[a-z][a-z]*'
ORDER by F7
;

Wie kombiniere ich das? Ich habe mal GROUP BY versucht, aber das gibt einen Syntaxfehler:
SELECT Query.[F2], Query.[F3], Query.[F7], Query.[F8] FROM Query
GROUP BY F7
WHERE F7 like '[a-z][a-z]*'
ORDER by F7
;
 
Werbung:
Hinweis, falls nicht klar: F2, F3, F8 sollen natürlich nur angezeigt werden, wenn es ein F7 dazu gibt.
Die Daten bilden pro Zeile eine Einheit. Die Spalte F7 legt fest, welche Zeile angezeigt wird; aber wenn ich in F7 einen Eintrag habe, dann gehört F2. F3, F8 einfach dazu.
 
DISTINCT ist nichts anderes als eine Gruppierung über alle Spalten, das kannst du auch mit GROUP BY umsetzen. Bei einem GROUP BY müssen aber alle Spalten im Select-Teil entweder auch im GROUP BY stehen oder aggregiert werden. Ist logisch auch nicht anders möglich, was soll er denn mit unterschiedlichen Werten in einer deiner anderen Spalten machen?

GROUP BY steht auch hinter dem WHERE-Teil und vor ORDER BY, daher dein Syntax Fehler.

F7 hört sich stark danach an das du Access wie eine Tabellenkalkulation behandelst, es ist aber eine relationale Datenbank. Bedenke das bitte, ich weiß ja nicht was da für Attribute hinter deinen F-Spalten stecken.
 
was soll er denn mit unterschiedlichen Werten in einer deiner anderen Spalten machen?
Einfach anzeigen? Ich befürchte, ich verstehe nicht, was du meinst. Die erste SELECT-Anweisung hat ja für meine Zwecke schon richtig gearbeitet:
SELECT Distinct F7 from Query where F7 like '[a-z][a-z]*' order by F7

Aber leider fehlen dann die anderen Spalten. Ist es denn wirklich absolut unmöglich, dass ich die Spalte F7 (oder irgendeine andere) sortiere und filtere, aber dann die DAZU GEHÖRENDEN Einträge aus den anderen Spalten auch sehe?

Ja, ich verstehe schon deinen Verweis auf Excel. In Excel ist das in der Voreinstellung automatisch so, dass immer eine komplette Zeile angezeigt wird. Wenn ich in Excel eine Spalte filtere, dann werden trotzdem ganze Zeilen angezeigt. Geht so was in Access absolut gar nicht?

Wobei meine zweite Variante ja auch schon ziemlich dicht ist:

SELECT Query.[F2], Query.[F3], Query.[F7], Query.[F8] FROM Query
WHERE F7 like '[a-z][a-z]*'
ORDER by F7
;

Da sehe ich mehrere Spalten UND die Spalte F7 legt mit "like" fest, welche Zeilen ich sehe.
Das ist doch schon so eine Art Filterung... und diesen Filter würde ich gerne noch so erweitern, dass auch doppelte Einträge der Spalte F7 verschwinden. Aber trotzdem die anderen Spalten eingeblendet werden.

Ich habe verstanden, dass ich DISTINCT auch auf mehrere Spalten anwenden kann. Aber das ist nicht das, was ich erreichen will. Ich will ja nur die doppelten Einträge EINER Spalte zum Ausblenden verwenden; nicht die Einträge die über alle Spalten ein Doppel bilden.
 
Einfach anzeigen? Ich befürchte, ich verstehe nicht, was du meinst. Die erste SELECT-Anweisung hat ja für meine Zwecke schon richtig gearbeitet:
SELECT Distinct F7 from Query where F7 like '[a-z][a-z]*' order by F7

Aber leider fehlen dann die anderen Spalten. Ist es denn wirklich absolut unmöglich, dass ich die Spalte F7 (oder irgendeine andere) sortiere und filtere, aber dann die DAZU GEHÖRENDEN Einträge aus den anderen Spalten auch sehe?
Ja aber du musst verstehen das er einen Wert immer in einer Zeile und einer Spalte anzeigen muss. Wenn du also Spalte F7 gruppierst und zum gleichen Wert in F7 gibt es in F8 zwei unterschiedliche Werte dann muss er die entweder zusammen führen (aggregieren) oder er zeigt beide an in je einer Zeile. Das ist ein logisches Grundprinzip.
Ja, ich verstehe schon deinen Verweis auf Excel. In Excel ist das in der Voreinstellung automatisch so, dass immer eine komplette Zeile angezeigt wird. Wenn ich in Excel eine Spalte filtere, dann werden trotzdem ganze Zeilen angezeigt. Geht so was in Access absolut gar nicht?
Ja Filtern kannst du im WHERE-Teil. Aber auch Excel zeigt dann mehrere Zeilen an wenn du in Spalte F8 unterschiedliche Werte hast und die Spalte nicht ausblendest. Filtern hat mit Gruppieren gar nichts zu tun.
Wobei meine zweite Variante ja auch schon ziemlich dicht ist:

SELECT Query.[F2], Query.[F3], Query.[F7], Query.[F8] FROM Query
WHERE F7 like '[a-z][a-z]*'
ORDER by F7
;
Das ist gefiltert, nicht gruppiert.
Da sehe ich mehrere Spalten UND die Spalte F7 legt mit "like" fest, welche Zeilen ich sehe.
Das ist doch schon so eine Art Filterung... und diesen Filter würde ich gerne noch so erweitern, dass auch doppelte Einträge der Spalte F7 verschwinden. Aber trotzdem die anderen Spalten eingeblendet werden.
Du kannst mit gruppieren doppelte Zeilen ausblenden. Es müssen nur alle Werte doppelt sein, in dem Moment, wo ein Wert unterschiedlich ist, ist der Datensatz ja nicht mehr doppelt sondern anders. Du kannst unterschiedliche Werte durch aggregieren zusammen fassen aber das musst du der Datenbank auch sagen.
Ich habe verstanden, dass ich DISTINCT auch auf mehrere Spalten anwenden kann. Aber das ist nicht das, was ich erreichen will. Ich will ja nur die doppelten Einträge EINER Spalte zum Ausblenden verwenden; nicht die Einträge die über alle Spalten ein Doppel bilden.
 
OK, doppelte Werte in anderen Spalten müssen sichtbar sein. Deswegen muss ich DESTINCT über mehrere Spalten anwenden.
Danke, mein Problem wurde gelöst und ihr habt mir sehr geholfen.
 
Werbung:
Wie gesagt die Alternative ist Aggregation, also z.B. eine Summe, ein Durchschnitt, eine Anzahl, Maximum, Minimum. Auch für Text kann meist max() verwendet werden, über den Sinn kann man natürlich streiten :)
 
Zurück
Oben