AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?)
Thema durchsuchen
Ansicht
Themen-Optionen

SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?)

Ein Thema von sunfy · begonnen am 14. Dez 2005 · letzter Beitrag vom 17. Dez 2005
Antwort Antwort
Seite 1 von 2  1 2      
sunfy

Registriert seit: 27. Apr 2004
22 Beiträge
 
#1

SQL-Abfrage (Daten aus Verknüpfungstabelle mit ausgeben?)

  Alt 14. Dez 2005, 17:14
Datenbank: Access • Version: 2000 • Zugriff über: ADO Connection
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
  Mit Zitat antworten Zitat
sunfy

Registriert seit: 27. Apr 2004
22 Beiträge
 
#2

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

  Alt 15. Dez 2005, 15:21
hab mein Problem mal etwas genauer beschrieben.
Vielleicht könnt ihr mir jetzt besser helfen.
Thnx Sunfy
  Mit Zitat antworten Zitat
Benutzerbild von tomsel
tomsel

Registriert seit: 8. Dez 2005
Ort: am Chiemsee
304 Beiträge
 
Delphi 7 Professional
 
#3

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

  Alt 15. Dez 2005, 16:26
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)
Ein Experte ist ein Mann, der hinterher genau sagen kann, warum seine Prognose nicht gestimmt hat. (Winston Churchill)
  Mit Zitat antworten Zitat
sunfy

Registriert seit: 27. Apr 2004
22 Beiträge
 
#4

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

  Alt 16. Dez 2005, 15:01
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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#5

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

  Alt 16. Dez 2005, 18:32
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
  Mit Zitat antworten Zitat
Benutzerbild von tomsel
tomsel

Registriert seit: 8. Dez 2005
Ort: am Chiemsee
304 Beiträge
 
Delphi 7 Professional
 
#6

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

  Alt 16. Dez 2005, 20:02
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!
Ein Experte ist ein Mann, der hinterher genau sagen kann, warum seine Prognose nicht gestimmt hat. (Winston Churchill)
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#7

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

  Alt 16. Dez 2005, 20:13
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
  Mit Zitat antworten Zitat
sunfy

Registriert seit: 27. Apr 2004
22 Beiträge
 
#8

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

  Alt 16. Dez 2005, 20:17
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.
  Mit Zitat antworten Zitat
Benutzerbild von tomsel
tomsel

Registriert seit: 8. Dez 2005
Ort: am Chiemsee
304 Beiträge
 
Delphi 7 Professional
 
#9

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

  Alt 16. Dez 2005, 20:28
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).
Ein Experte ist ein Mann, der hinterher genau sagen kann, warum seine Prognose nicht gestimmt hat. (Winston Churchill)
  Mit Zitat antworten Zitat
sunfy

Registriert seit: 27. Apr 2004
22 Beiträge
 
#10

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

  Alt 16. Dez 2005, 21:21
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.
Angehängte Dateien
Dateityp: zip datenbank_mustermann_151.zip (111,0 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:49 Uhr.
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