![]() |
Datenbank: Access • Version: 2000 • Zugriff über: ADO Connection
SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?)
Hi Leutz,
Ich habe drei Tabellen.
SQL-Code:
Kathegorie1
-------------------- Kath1_ID AutoWert Kath1_Datum Datum ... usw Person -------------------- Pers_ID AutoWert Pers_Name Text Pers_b_Kath1 -------------------- Pers_b_Kath1_ID AutoWert Pers_ID Zahl Kath1_ID Zahl Pers_b_Kath1_Wertung Ja/Nein Die Tabellen Kathegorie1 und Person sind über die Tabelle Pers_b_Kath1 verknüpft. Es gibt verschiedene Ereignisse und ich möchte alle Personen mit dem Datum deren jewiligen letzten Anwesenheit bei einem Ereignis in der Kathegorie 1 ausgeben. Personen die noch keine Verknüpfung zu Kath1 haben also noch bei keinem Ereignis der Kath 1 waren sollen auch mit aufgelistet werden, das Datumsfeld dann aber entsprechend leer bleiben. kleines Beispiel:
SQL-Code:
Zum Schluss soll eine Tabelle herauskommen in der steht:
Tabelle Person Tabelle Kathegorie 1 Tabelle Pers_b_Kath1
P_ID P_Name Kath1_ID Kath1_Datum PbK1_ID P_ID K_ID PbK_Wertung -------------- ---------------------- -------------------------------- 1 Peter 10 10.12.2005 20 1 10 True 2 Fritz 11 11.12.2005 21 1 11 False 3 Gustav 12 12.12.2005 22 2 11 True 23 2 12 True
SQL-Code:
Diese Tabelle besagt uns,
P_ID P_Name Kath1_Datum Pbk_Wertung
-------------------------------------------- 1 Peter 11.12.2005 False 2 Fritz 12.12.2005 True 3 Gustav das Peter das letzte mal bei einem Ereignis der Kath1 am 11.12.2005 war, die Wertung = False ist das Fritz das letzte mal bei einem Ereignis der Kath1 am 10.12.2005 war, die Wertung = True ist das Gustav noch bei keinem Ereigniss der Kath1 dabei war. Mit der folgenden Abfrage lese ich die Daten aus den Tabellen aus:
SQL-Code:
Diese Abfrage funktioniert auch wunderbar, doch wie kann ich noch die Daten die zusätzlich in der Verknüpfungstabelle also Pers_b_Kath1 drin stehen mit auslesen?
SELECT Max(Kathegorie1.Kath1_Datum) AS Kath1_Datum,
Person.Pers_ID, Person.Pers_Name, Person.Pers_Vorname FROM Person LEFT JOIN (Pers_b_Kath1 LEFT JOIN Kathegorie1 ON Kathegorie1.Kath1_ID = Pers_b_Kath1.Kath1_ID) ON Person.Pers_ID = Pers_b_Kath1.Pers_ID GROUP BY Person.Pers_ID, Person.Pers_Name, Person.Pers_Vorname ORDER BY Max(Kathegorie1.Kath1_Datum); Wenn ich Pers_b_Kath1.Wertung mit in die Select Funktion schreibe, bekomme ich die Meldung, dass Pers_b_Kath1.Wertung nicht als Teil der Agregatfunktion eingeschlossen ist. Und wenn ich Pers_b_Kath1.Wertung mit in die Group By Klausel setze bekomme ich ja eine andere Ausgabe in der von jeder Person das letzte Ereignis von Kath1 mit Wertung = true und von derselben Person das letzte ereignis mit Wertung = false
SQL-Code:
Wie kann ich also die Daten der Verknüpfungstabelle ausgeben, ohne diese mit in die GOUP BY klausel aufnehmen zu müssen?
P_ID P_Name Kath1_Datum Pbk_Wertung
-------------------------------------------- 1 Peter 10.12.2005 True 1 Peter 11.12.2005 False 2 Fritz 12.12.2005 True 3 Gustav Gruß Sunfy |
Re: SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?
hab mein Problem mal etwas genauer beschrieben.
Vielleicht könnt ihr mir jetzt besser helfen. Thnx Sunfy |
Re: SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?
Also nach erstem Überfliegen gehe ich mal davon aus, dass Du Dich von group by verabschieden solltest.
Ein Ansatz könnte sein, Deinen Select mit einer where-Klausel zu versehen, wo in einem Sub-Select nach dem maximalen Datum zur aktuell betrachteten Person gesucht wird. (ohne Gewehr, äähhm, Gewähr) |
Re: SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?
Ja, die Idee das Group By durch irgendetwas anderes zu ersetzten kam mir auch schon.
Aber bis jetzt habe ich noch keine mögliche Lösung für dieses Problem gefunden. Hatte schon versucht, mehrere Abfragen miteinander zu verknüpfen. Doch dabei mußte ich immer ein GROUP BY mit Werten aus der Tabelle Person_b_Kath1 durchführen. Hat von euch jeman eine Idee, wie man das Problem lösen könnte? Gruß Sunfy ps.: Die Tabelle Pers_b_Kath1 hat noch einen weiteren Eintrag Bemerkung, was bei einem Group By immer dazu führt dass ich unerwünschte Tupel erhalte.
SQL-Code:
Pers_b_Kath1
-------------------- Pers_b_Kath1_ID AutoWert Pers_ID Zahl Kath1_ID Zahl Pers_b_Kath1_Wertung Ja/Nein Pers_b_Kath1_Bemerkung Text |
Re: SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?
Moin,
ich würde das mit einer Unterabfrage lösen. Wobei ich nicht weiss, ob Access das kann.
SQL-Code:
Das ist jetzt einfach mal so aus dem Kopf entsprungen. Wer Fehler findet, darf sie behalten.
SELECT Kathegorie1.Kath1_Datum,
Person.Pers_ID, Person.Pers_Name, Person.Pers_Vorname, Kathegorie1.Pbk_Wertung FROM Person LEFT JOIN (Pers_b_Kath1 LEFT JOIN Kathegorie1 ON Kathegorie1.Kath1_ID = Pers_b_Kath1.Kath1_ID) ON Person.Pers_ID = Pers_b_Kath1.Pers_ID WHERE Kathegorie1.Kath1_Datum = (SELECT Max(Kath1_Datum) FROM Kathegorie1 WHERE Kath1_ID = Pers_b_Kath1.Kath1_ID) ORDER BY Kathegorie1.Kath1_Datum; MfG Thorsten |
Re: SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?
Zitat:
|
Re: SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?
Oh ja, das hatte ich gar nicht gesehen. Du hattest das ja schon vorgeschlagen.
Ja, bei Access muss man immer vorsichtig sein. Was da geht oder eben nicht, ist nicht logisch und folgt auch keinem Standard. Besonders schlecht finde ich diese besch***** Klammerbildung bei den JOINs. MfG Thorsten |
Re: SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?
Danke schonmal für eure Ideen, aber eine verschachtelte Select Anweisung hatte ich auch schon ausprobiert, funktioniert nur noch nicht ganz.
Mit der Abfrage von Omata
SQL-Code:
bekommt man alle Ereignisse der Personen heraus.
SELECT Kathegorie1.Kath1_Datum,
Person.Pers_ID, Person.Pers_Name, Person.Pers_Vorname, Pers_b_Kath1.Pers_b_Kath1_Wertung, Pers_b_Kath1.Pers_b_Kath1_Bemerkung FROM Person LEFT JOIN (Pers_b_Kath1 LEFT JOIN Kathegorie1 ON Pers_b_Kath1.Kath1_ID = Kathegorie1.Kath1_ID) ON Person.Pers_ID = Pers_b_Kath1.Pers_ID WHERE (((Kathegorie1.Kath1_Datum)=(SELECT Max(Kathegorie1.Kath1_Datum) FROM Kathegorie1 WHERE Kath1_ID = Pers_b_Kath1.Kath1_ID))) ORDER BY Kathegorie1.Kath1_Datum; d.h. wenn eine Person vier mal bei einem Kathegorie1-Ereignis eingetragen ist, werde auch alle vier Tupel ausgegeben und nicht nur das Tupel mit dem jeweils letzten Ereignis der Personen. Und daher meine Frage, wie man die Ergebnisse nach dem aktuellsten jeder PersonenID selektieren kann. GroupBy funktioniert ja nicht. |
Re: SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?
Zitat:
|
Re: SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?
Liste der Anhänge anzeigen (Anzahl: 1)
ich hab mal die Datenbank mit Musterdaten gefüllt.
(ist gezippt attached) die ganzen zzz_Abfragen sind Müll, die braucht ihr nicht zu berücksichtigen. Da hab ich mal verschiedene Sachen ausprobiert. |
Re: SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?
SQL-Code:
Im Subselect muß die datumsmäßig aktuellste Kategorie zur gerade betrachteten Person ermittelt werden. Bei meinem "Vorposter" fehlte in der Unterabfrage leider jeder Bezug zur Person.
SELECT Kathegorie1.Kath1_Datum, Person.Pers_ID, Person.Pers_Name, Person.Pers_Vorname, pk.Pers_b_Kath1_Wertung, pk.Pers_b_Kath1_Bemerkung
FROM Person LEFT JOIN (Pers_b_Kath1 pk LEFT JOIN Kathegorie1 ON pk.Kath1_ID = Kathegorie1.Kath1_ID) ON Person.Pers_ID = pk.Pers_ID WHERE (((Kathegorie1.Kath1_Datum)=( SELECT Max(Kathegorie1.Kath1_Datum) FROM Kathegorie1, Pers_b_Kath1 WHERE Pers_b_Kath1.Pers_ID = pk.Pers_ID and Kathegorie1.Kath1_ID=Pers_b_Kath1.Kath1_ID))) ORDER BY Kathegorie1.Kath1_Datum; Ich hoffe, das passt jetzt. Garantieren will ich mal lieber nichts, prüf es lieber selbst noch mal nach. |
Re: SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?
Tja, das funktioniert zwar jetzt endlich.
Aber da sind dann nur die Personen drin, die auch in der Pers_b_Kath1 einen Eintrag haben. Eigentlich ist das aber so eingestellt, dass alle Personen angezeigt werden sollen. Geht aber nicht. Da sieht man mal wieder wie sch***** Access ist. Ich habe jetzt drei Abfragen realisiert, die alle aufeinander aufbauen. Dann kann man das auch Access beibringen. Andere (richtige Datenbanken) können das in einer Abfrage. Wie auch immer, probiers doch mal aus... Abfrage "view_MaxDatum"
SQL-Code:
Abfrage "view_MaxDatumInfos"
SELECT Pers_b_Kath1.Pers_ID,
MAX(Kathegorie1.Kath1_Datum) AS [Max von Kath1_Datum] FROM Kathegorie1 INNER JOIN Pers_b_Kath1 ON Kathegorie1.Kath1_ID = Pers_b_Kath1.Kath1_ID GROUP BY Pers_b_Kath1.Pers_ID;
SQL-Code:
Eigentliche Abfrage
SELECT view_MaxDatum.Pers_ID,
view_MaxDatum.[Max von Kath1_Datum], Pers_b_Kath1.Pers_b_Kath1_Wertung, Pers_b_Kath1.Pers_b_Kath1_Bemerkung FROM (view_MaxDatum INNER JOIN Kathegorie1 ON view_MaxDatum.[Max von Kath1_Datum] = Kathegorie1.Kath1_Datum) INNER JOIN Pers_b_Kath1 ON (Pers_b_Kath1.Pers_ID = view_MaxDatum.Pers_ID) AND (Kathegorie1.Kath1_ID = Pers_b_Kath1.Kath1_ID);
SQL-Code:
Da weden dann alle Personen ausgegeben, mit den jeweils letzten Informationen aus Pers_b_Kath1.
SELECT Person.Pers_ID,
Person.Pers_Name, view_MaxDatumInfos.[Max von Kath1_Datum], view_MaxDatumInfos.Pers_b_Kath1_Wertung, view_MaxDatumInfos.Pers_b_Kath1_Bemerkung FROM Person LEFT JOIN view_MaxDatumInfos ON Person.Pers_ID = view_MaxDatumInfos.Pers_ID ORDER BY Person.Pers_Name; MfG Thorsten |
Re: SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?
SQL-Code:
jetzt besser?
SELECT Kathegorie1.Kath1_Datum, Person.Pers_ID, Person.Pers_Name, Person.Pers_Vorname, pk.Pers_b_Kath1_Wertung, pk.Pers_b_Kath1_Bemerkung
FROM Person LEFT JOIN (Pers_b_Kath1 pk LEFT JOIN Kathegorie1 ON pk.Kath1_ID = Kathegorie1.Kath1_ID) ON Person.Pers_ID = pk.Pers_ID WHERE (((Kathegorie1.Kath1_Datum)=( SELECT Max(Kathegorie1.Kath1_Datum) FROM Kathegorie1, Pers_b_Kath1 WHERE Pers_b_Kath1.Pers_ID = pk.Pers_ID and Kathegorie1.Kath1_ID=Pers_b_Kath1.Kath1_ID)) or pk.Pers_ID is null) ORDER BY Kathegorie1.Kath1_Datum; |
Re: SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?
Ja, das sieht doch gut aus.
Jetzt muss es nur noch sunfy gefallen. Bis dann Thorsten |
Re: SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?
Hey, ihr seid Klasse.
Vielen, vielen Dank. Hab grad mal den letzten Code von Tomsel ausprobiert und der liefert genau das, was ich die ganze Zeit versucht habe hinzubekommen. Wer mich jetzt erstmal die verschiedenen Varianten durchlesen, was genau ihr für Ideen hattet. Die letzte Idee von Tomsel, eine Where Abfrage von einem Speziell auf das Maximale Datum ausgerichteten Join zu machen ist klasse, da wäre ich so schnell nicht drauf gekommen. Die aufeinander aufbauenden Abfragen von Omata funktionieren auch wunderbar. Werd Sie mir gleich nochmal in Ruhe anschauen um zu verstehen, was genau sie jeweils machen, hab ich jetzt auf Anhieb noch nicht ganz verstanden. Aber nochmals vielen Dank. Habt mir sehr weitergeholfen. Gruß Sunfy |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz