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: 2 Ergebniszeilen in eine vereinen (https://www.delphipraxis.net/101861-sql-2-ergebniszeilen-eine-vereinen.html)

Nju 19. Okt 2007 08:39

Datenbank: Access • Version: 2003 • Zugriff über: ADO

SQL: 2 Ergebniszeilen in eine vereinen
 
Hallo,
ich benutze eine MS Access-Datenbank zusammen mit List & Label 12.

Die Situation:

Ich habe zwei Tabellen, die eine Tabelle mit Stammdaten, wie Bezeichnung, eindeutige Nummer, Bankleitzahl, etc, nennen wir diese "Tabelle_Stamm", die zweite besteht aus der Anschrift, nennen wir diese Tabelle "Tabelle_Anschrift". Die Datensätze der Tabelle_Anschrift können anhand der eindeutigen Nummer den Datensätzen der Tabelle_Stamm zugeordnet werden, zudem kennzeichnet der jeweilige Datensatz in der Tabelle_Anschrift, ein Feld namens "Art", ob es sich um eine normale Postanschrift, Postfach oder Großlieferantenanschrift handelt.

Das Problem:

Aufgrund der Art der Anschrift, kann bei einer einfachen SQL-Abfrage

Bsp.
SQL-Code:
Select Tabelle_Stamm.*, Tabelle_Anschrift.* from Tabelle_Stamm, Tabelle_Anschrift
where Tabelle_Stamm.Nummer = Tabelle_Anschrift.Nummer
and Tabelle_Stamm.Nummer = "137"
ein Ergebnis mit bis zu drei Datensätzen vorkommen, da es ja 3 verschiedene Arten gibt. Für List & Label ist diese Vorgehensweise aber ungeeignet, da mir diese drei Mal die gleiche Einrichtung zurückgeben würde, nur eben mit unterschiedlichen Anschriften.

Meine Frage:

Wie muss der SQL-Befehl gestaltet werden, damit ich mit Access eine Ergebniszeile wiederbekomme, in der, falls vorhanden, alle drei Arten und somit Datensätze, vereint worden sind? Gibt es virtuelle Felder, die man bei Bedarf anlegen kann?

DeddyH 19. Okt 2007 08:42

Re: SQL: 2 Ergebniszeilen in eine vereinen
 
Das hört sich für mich nach einer Pivot-Tabelle (auch Kreuztabelle genannt) an. Ich weiß nicht, inwieweit das mit Access umzusetzen ist, aber hier mal ein Link dazu.

mkinzler 19. Okt 2007 08:44

Re: SQL: 2 Ergebniszeilen in eine vereinen
 
In dem du 3 Joins auf die 3 Arten machst du den Felder verschiedene Namen gibst.

DeddyH 19. Okt 2007 08:46

Re: SQL: 2 Ergebniszeilen in eine vereinen
 
Jepp, oder so, dann muss es aber IMHO ein OUTER JOIN sein.

Nju 22. Okt 2007 10:09

Re: SQL: 2 Ergebniszeilen in eine vereinen
 
Hallo und vielen Dank für Eure Antworten. Ich habe das Wochenende mal etwas genutzt und mich daran gesetzt. Leider ist das MS Access Kompendium von M+T nicht gerade hilfreich und auch die Onlinehilfe befasst sich nur mit der Entwurfsansicht.

Könnte jemand so freundlich sein und mir ein kleines Beispiel zu der oben beschriebenen Problematik geben? Sollte das zu viel Mühe machen wäre ich dankbar über eine Onlinequelle, in die ich mich reinlesen könnte (bitte speziell auf MS Access zugeschnitten).

Vielen vielen Dank im Voraus!

marabu 22. Okt 2007 10:39

Re: SQL: 2 Ergebniszeilen in eine vereinen
 
Hallo,

prinzipiell geht das so:

SQL-Code:
select S.*, K.Anschrift, Z.Anschrift, L.Anschrift
from Tabelle_Stamm S
left outer join Tabelle_Anschrift K ON S.Nummer = K.Nummer and K.art = 'Korrespondenz'
left outer join Tabelle_Anschrift Z ON S.Nummer = K.Nummer and K.art = 'Zustellung'
left outer join Tabelle_Anschrift K ON S.Nummer = K.Nummer and K.art = 'Lager'
where S.Nummer = :Nummer
Beachte aber die von JET-SQL geforderte Klammerung (fehlt hier).

Grüße vom marabu

Nju 22. Okt 2007 11:24

Re: SQL: 2 Ergebniszeilen in eine vereinen
 
Vielen Dank! Nur leider erhalte ich nun bei folgendem Code die Fehlermeldung 'Syntaxfehler (fehlender Operator) in Abfrageausdruck ".':

SQL-Code:
SELECT S.*, K.*, L.*
FROM Tabelle_Stamm S
LEFT OUTER JOIN Tabelle_Anschrift K ON S.Nummer = K.Nummer AND S.Verband = K.Verband AND L.Art = "1"
LEFT OUTER JOIN Tabelle_Anschrift L ON S.Nummer = L.Nummer AND S.Verband = L.Verband AND L.Art = "2"
WHERE S.Nummer = "10" AND S.Verband = "Hauptnehmer"

Ich habe auch etwas rumgespielt und erstmal die zweite Left Outer Join-Abfrage ausgelassen und erhalte ebenfalls eine Fehlermeldung, wenn ich nicht nach dem ON bis hinter "1" das in Klammern setze. Mit Klammer komme ich zu einem Ergebnis.
Aber mit einem zweiten LEFT OUTER JOIN komme ich gar nicht mehr weiter. Woran kann das liegen, dass er mein zweites LEFT OUTER JOIN gar nicht will und die oben beschriebene Fehlermeldung generiert wird?

Als Hinweis:
Ich befinde mich derzeit noch in MS Access und deren SQL-Abfrageditor, also noch nichts in Delphi selbst.

marabu 22. Okt 2007 12:28

Re: SQL: 2 Ergebniszeilen in eine vereinen
 
Wer von uns beiden hat eigentlich das Access-Handbuch?

(Hint: Ich nicht)

SQL-Code:
SELECT S.*, K.*, L.*
FROM ( Tabelle_Stamm S
LEFT OUTER JOIN Tabelle_Anschrift K ON S.Nummer = K.Nummer AND S.Verband = K.Verband AND L.Art = "1" )
LEFT OUTER JOIN Tabelle_Anschrift L ON S.Nummer = L.Nummer AND S.Verband = L.Verband AND L.Art = "2"
WHERE S.Nummer = "10" AND S.Verband = "Hauptnehmer"
Etwa so stelle ich mir die Klammerung vor. Du solltest das aber wirklich mal anhand der Syntax-Referenz prüfen.

Freundliche Grüße

Nju 23. Okt 2007 08:15

Re: SQL: 2 Ergebniszeilen in eine vereinen
 
Vielen Dank für deine Antwort! Der Lösungsvorshclag funktioniert nicht (Fehlermeldung "Fehler in FROM-Syntax").

Dieses "Microsoft Office Access 2003"-Kompendium von M+T beschreibt einzigst den Weg über die Entwurfs-Ansicht und gibt so gut wie keine Tipps im Umgang mit der SQL-Syntax. Problem ist aber, dass ich mit der Entwurfs-Ansicht solch komplexe Abfragen nicht hinbekomme und ich möchte mich nicht umständlich erst in die Entwurfs-Ansicht und deren Funktionen einarbeiten, wenn der "simple" SQL-Befehl doch eigentlich hervorragend funktioniert (sofern er funktioniert) - zumal ich diesen ja später unter Delphi dann brauche.

Nju 23. Okt 2007 10:12

Re: SQL: 2 Ergebniszeilen in eine vereinen
 
So, mittlerweile habe ich eine Lösung gefunden, die NICHT mit left outer join bewerkstelligt wurde, sondern mit inner join (Zusammengeklickt mit der Entwurfs-Ansicht von Access):

SQL-Code:
SELECT S.*, K.*, S.Nummer, S.Nummer, S.verband, S.verband, K.art, L.*, S.nummer, S.verband, L.art
FROM tabelle_anschrift AS L, tabelle_stamm AS S, tabelle_anschrift AS K
WHERE (((S.nummer)=[K].[nummer] And (S.nummer)="10" And (S.nummer)=[L].[nummer]) AND ((S.verband)="Hauptnehmer" And (S.verband)=[K].[verband] And (S.verband)=[L].[verband]) AND ((K.art)="1") AND ((L.art)="2"));
Wenn jetzt aber kein Datensatz für diese Nummer mit der Art 2 existiert (aber Art 1 schon), dann zeigt er mir keine Ergebniszeile an.

Wie kann ich diese Ergebniszeile doch anzeigen lassen und die Felder für Art 2 bleiben dafür leer?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:28 Uhr.
Seite 1 von 2  1 2      

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