hty Geschrieben 31. Mai 2003 Teilen Geschrieben 31. Mai 2003 Hallo ich habe eine Access 2000 Datenbank vor mir und folgendes Problem. Eine Tabelle mit mehreren Spalten die ich jetzt ganz einfach Spalte-1 bis Spalte-5 nenne. Spalte-1 = Primärschlüssel Spalte-2 = ist eine Zahl die in der Tabelle mehrfach vorkommt Um zu verhindern das Datensätze angezeigt werden die doppelt vorkommen, hat man mir empfohlen in der SQL-Ansicht "DISTINCT" hinter "SELECT" zu setzen.... Wer sagts das funktioniert auch ) ( Aber nur solange ich auf die Anzeige des Inhaltes der Spalte-1 (Primärschlüssel) verzichte !!! Ich kann jede erdenkliche Kombination der verschiedenen Spalten zusammenstellen und bekomme immer das gewünschte Ergebnis. Nur wenn ich in meine Abfrage den Primärschlüsssel (also die Spalte-1) hinzunehme bekomme ich wieder alle Datensätze angezeigt... So das trotz dem DISTINCT-Befehl die Zahlen die in Spalte-2 doppelt vorkommen angezeigt werden. Ich möchte aber Spalte-1 bis Spalte-5 anzeigen lassen und Datensätze die unter Spalte-2 den selben Eintrag haben nur je einmal sehen. Gehe ich das komplet verkehrt an? Wer kann mir sagen wie ich es richtig mache? Kann mann überhaupt verstehen was mein Problem ist? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
HolzOnkel Geschrieben 31. Mai 2003 Teilen Geschrieben 31. Mai 2003 Ich denke schon... ...mein Vorschlag: SELECT MIN(Spalte1) AS Spalte1, Spalte2, Spalte3, Spalte4, Spalte5 FROM WasAuchImmer WHERE lablahfasel GROUP BY Spalte2, Spalte3, Spalte4, Spalte5 ORDER BY Spalte2 (zum Bleistift) Damit hast Du jede Datenzeile nur einmal, und auch nur einen Eintrag bei Spalte1 (in dem Fall halt die kleinste ID-Nummer, wo es auftritt). Ausserdem bin ich mittlerweile vom DISTINCT abgekommen - ist zwar weniger Schreibarbeit, aber anscheinend im Vergleich zu einem GROUP BY auf alle Felder bei grossen Abfragen langsamer. Gruss, der Onkel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
loeti Geschrieben 5. Juni 2003 Teilen Geschrieben 5. Juni 2003 Grundsätzlich ist dies das falsche Vorgehen, denn der DISTINCT filtert nur diejenigen doppelten Einträge, die sich aus ALLEN Spalten ergeben. Wenn du also den Primärschlüssel mit selektierst, geht der in Kombination mit den anderen Spalten in den DISTINCT ein. Was erwartest du denn, dass der Select zurückliefert, z.B. in folgendem Fall? Spalte 1 Spalte 2 ---------------------------- 1 1 1 2 1 3 1 4 2 1 2 2 2 3 2 4 Wenn du in Spalte 2 nur einmal die "1" ausgegeben haben möchtest, was soll dir der Select dann in Spalte 1 zurückliefern? "1" oder "2"? Das "weiß" das DB System natürlich nicht. Eine Möglichkeit wäre, hier sog. Gruppenfunktionen anzuwenden, wie es HolzOnkel bereits vorgeschlagen hat mit der "MIN" Methode. Allerdings stellt sich hier wirklich die Frage, was du denn überhaupt willst?! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
hty Geschrieben 24. Juli 2003 Autor Teilen Geschrieben 24. Juli 2003 Hallo Ich habe folgende Anweisung vorliegen: SELECT Artikel.[Artikel-Nr], Artikel.[Video-Nr], [Archiv Video].Titel, [Archiv Video].Künstlername FROM Verkaufsdaten RIGHT JOIN (Kaufdaten RIGHT JOIN ([Archiv Video] RIGHT JOIN Artikel ON [Archiv Video].[Video-Nr] = Artikel.[Video-Nr]) ON Kaufdaten.KaufNr = Artikel.KaufNr) ON Verkaufsdaten.AuftragNr = Artikel.AuftragNr WHERE (((Artikel.KaufNr)<>3) AND ((Artikel.Verkauft)=False)) ORDER BY [Archiv Video].Titel; "Artikel.[Artikel-Nr]" ist eine ID (AutoWert) und ist dem entsprechend eindeutig (kommt nur einmal vor). "Artikel.[Video-Nr]" kann mehrfach vorkommen (sie identifiziert das Video) Ich hingengen möchte das jedes Video (Artikel.[Video-Nr]) nur einmal vorkommt. Beispiel: Artikel.[Artikel-Nr]----Artikel.[Video-Nr]---- --------- 1 ------------------- 44 ------- --------- 2 ------------------- 25 ------- --------- 3 ------------------- 25 ------- --------- 4 ------------------- 11 ------- --------- 5 ------------------- 38 ------- Erwünschtes Ergebnis wäre die Auflistung der Artikel mit der Nr. 1,2,4,5 Als Lösungsvorschlag (hier nachzulesen: http://www.fachinformatiker-world.de/forums/showthread.php?s=&postid=407868#post407868) wurde mir folgendes genannt (an dieser Stelle einen herzlichen Dank an HolzOnkel und loeti): SELECT MIN(Spalte1) AS Spalte1, Spalte2, Spalte3, Spalte4, Spalte5 FROM WasAuchImmer WHERE lablahfasel GROUP BY Spalte2, Spalte3, Spalte4, Spalte5 ORDER BY Spalte2 Mein Umsetzungsversuch sah wie folgt aus: SELECT MIN(Artikel.[Artikel-Nr]) AS Artikel.[Artikel-Nr], Artikel.[Video-Nr], [Archiv Video].Titel, [Archiv Video].Künstlername FROM Verkaufsdaten RIGHT JOIN (Kaufdaten RIGHT JOIN ([Archiv Video] RIGHT JOIN Artikel ON [Archiv Video].[Video-Nr] = Artikel.[Video-Nr]) ON Kaufdaten.KaufNr = Artikel.KaufNr) ON Verkaufsdaten.AuftragNr = Artikel.AuftragNr WHERE (((Artikel.KaufNr)<>3) AND ((Artikel.Verkauft)=False)) GROUP BY Artikel.[Video-Nr], [Archiv Video].Titel, [Archiv Video].Künstlername ORDER BY [Archiv Video].Titel; Offensichtlich ist das falsch, aber wo?? Was konkrett ist hier falsch? Meldung: "Die SELCT-Anweisung schließt ein reserviertes Wort oder ein Argument ein, das/der falsch, mit falscher Zeichensetzung oder überhaut nicht eingegeben wurde." Woran scheitert es? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Wolle Geschrieben 24. Juli 2003 Teilen Geschrieben 24. Juli 2003 Ich hab das mal zusammengeführt. Ist übersichtlicher, wenn man nicht hin und her springen muß. Das nächste mal bitte im alten Thread weitermachen, wenn das das alte Problem betrifft. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
HolzOnkel Geschrieben 28. Juli 2003 Teilen Geschrieben 28. Juli 2003 Mein Umsetzungsversuch sah wie folgt aus: SELECT MIN(Artikel.[Artikel-Nr]) AS Artikel.[Artikel-Nr], Artikel.[Video-Nr], [Archiv Video].Titel, [Archiv Video].Künstlername FROM Verkaufsdaten RIGHT JOIN (Kaufdaten RIGHT JOIN ([Archiv Video] RIGHT JOIN Artikel ON [Archiv Video].[Video-Nr] = Artikel.[Video-Nr]) ON Kaufdaten.KaufNr = Artikel.KaufNr) ON Verkaufsdaten.AuftragNr = Artikel.AuftragNr WHERE (((Artikel.KaufNr)<>3) AND ((Artikel.Verkauft)=False)) GROUP BY Artikel.[Video-Nr], [Archiv Video].Titel, [Archiv Video].Künstlername ORDER BY [Archiv Video].Titel; Offensichtlich ist das falsch, aber wo?? Was konkrett ist hier falsch? Meldung: "Die SELCT-Anweisung schließt ein reserviertes Wort oder ein Argument ein, das/der falsch, mit falscher Zeichensetzung oder überhaut nicht eingegeben wurde." Woran scheitert es? Äh, auf den ersten Blick: MIN(Artikel.[Artikel-Nr]) AS Artikel.[Artikel-Nr], Wenn Du ein Feld mit "AS" in den Select einbeziehst, hat der Tabellenbezeichner da drin nichts zu suchen... also sollte es eher: MIN(Artikel.[Artikel-Nr]) AS [Artikel-Nr], heissen. Versuch es erstmal damit, ich bin heute etwas im Streß und kann erst heute Abend mal genauer drauf schauen... Gruss, der Onkel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
hty Geschrieben 29. Juli 2003 Autor Teilen Geschrieben 29. Juli 2003 Jaaaaa ) Funktioniert ! So sieht das ganze aus: ------------------------------------------------------- SELECT MIN (Artikel.[Artikel-Nr]) AS [Video-Nr], [Archiv Video].[Titel], [Archiv Video].[Künstlername] FROM Verkaufsdaten RIGHT JOIN (Kaufdaten RIGHT JOIN ([Archiv Video] RIGHT JOIN Artikel ON [Archiv Video].[Video-Nr]=[Artikel].[Video-Nr]) ON [Kaufdaten].[KaufNr]=[Artikel].[KaufNr]) ON [Verkaufsdaten].[AuftragNr]=[Artikel].[AuftragNr] WHERE ((([Artikel].[KaufNr])<>3) And (([Artikel].[Verkauft])=False)) GROUP BY Artikel.[Video-Nr], [Archiv Video].Titel, [Archiv Video].Künstlername ORDER BY [Archiv Video].[Titel]; ------------------------------------------------------- Die Tabellenbezeichner habe ich nach "AS" herausgenommen. Nur die Werte (Spalten) die aus anderen Tabellen stammen haben ihre Tabellenbezeichner behalten. ...und siehe da .... es funktioniert ;o) Herzlichen Dank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.