Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?) (https://www.delphipraxis.net/58921-sql-abfrage-daten-aus-verknuepfungstabelle-mit-ausgeben.html)

sunfy 14. Dez 2005 16:14

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:
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
Zum Schluss soll eine Tabelle herauskommen in der steht:
SQL-Code:
P_ID P_Name Kath1_Datum Pbk_Wertung
--------------------------------------------
 1    Peter  11.12.2005   False
 2    Fritz  12.12.2005   True
 3    Gustav
Diese Tabelle besagt uns,
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:
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);
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?
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:
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
Wie kann ich also die Daten der Verknüpfungstabelle ausgeben, ohne diese mit in die GOUP BY klausel aufnehmen zu müssen?
Gruß Sunfy

sunfy 15. Dez 2005 14:21

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

tomsel 15. Dez 2005 15:26

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)

sunfy 16. Dez 2005 14:01

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

omata 16. Dez 2005 17:32

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:
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;
Das ist jetzt einfach mal so aus dem Kopf entsprungen. Wer Fehler findet, darf sie behalten.

MfG
Thorsten

tomsel 16. Dez 2005 19:02

Re: SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?
 
Zitat:

ich würde das mit einer Unterabfrage lösen.
genau, hab ich ja bereits empfohlen. Jetzt bekommst du das sogar frei Haus. Sind Subselects nicht SQL-Standard? Dann sollte Access das beherrschen!

omata 16. Dez 2005 19:13

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

sunfy 16. Dez 2005 19:17

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:
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;
bekommt man alle Ereignisse der Personen heraus.
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.

tomsel 16. Dez 2005 19:28

Re: SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?
 
Zitat:

bekommt man alle Ereignisse der Personen heraus.
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.
Genau das soll eigentlich mit dem MAX im Subselect erreicht werden. Schieb doch mal die MDB-Datei rüber (oder gibt es Datenschutzprobleme).

sunfy 16. Dez 2005 20:21

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:29 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz