Supportnet / Forum / Datenbanken
komplizierte SQL-Abfrage (glaube ich)
Frage
Hallo Leute,
ich versuche mal mein Problem zu schildern. Es geht um Kontobeziehungen, also um Gattungsdaten, wer mit wem ein Konto hat usw.
Also ich habe zwei Tabellen, die Ausgangstabelle ist die Tabelle1. In dieser Tabelle sind alle Kunden aufgelistet. Von jedem Kunden wird ein eindeutiger Personenschlüssel erstellt. In der zweiten Tabelle sind nun sämtliche Beziehungen. Key1 stellt halt die erste und Key2 die zweite Person dar. Ich bräuchte nun in einer Abfrage jeweils die Kundennummer zu Key1 und Key2.
Bei der Arbeit kann ich leider nur mit Microsoft Access arbeiten, daher kann ich leider nicht alles ausprobieren.
Wäre super wenn mir da jemand helfen könnte, bin schon ein bißchen am verzweifeln :)
[b]TABELLE1[/b]
[b]Kdnr.............Name.............Vorname...Pers_key1[/b]
1234............Pflaume.........Kai..............1111
2345............Schmidt.........Jürgen........2222
3456............Peters............Heiner........3333
4567............Geller.............Uri...............4444
5678............Schörder.......Gerhard......5555
6789............Raab..............Stefan.........6666
7890............Gottschalk....Thomas......7777
8901............Kohl...............Helmut........8888
9012............Merkel............Angela........9999
[b]TABELLE2[/b]
[b]Key1............Key2............Beziehungsart[/b]
1111............2222............abc
1111............5555............fgh
2222............3333............xyz
2222............6666............abc
3333............4444............fgh
3333............7777............xyz
4444............5555............xyz
4444............8888............abc
5555............6666............abc
5555............9999............xyz
6666............7777............xyz
6666............4444............fgh
7777............8888............abc
7777............3333............abc
8888............9999............abc
8888............1111............abc
9999............1111............fgh
9999............2222............xyz
So [b]sollte [/b]die Abfrage aussehen:
[b]ABFRAGE[/b]
[b]Kdnr1........Key1..........Key2..........Kdnr2........Beziehungsart[/b]
1234..........1111..........2222..........2345..........abc
1234..........1111..........5555..........5678..........fgh
.
.
.
usw.
Antwort 1 von Marten
hat keiner ne idee?
Antwort 2 von disco
moin
das ist kein chat hier. musst dich ggf. etwas gedulden.
hab zwar vor 3 jahren das letzte mal was mit sql zu tun gehabt, aber müsste dass nicht in etwa so aussehen.
SELECT * FROM TABELLE1 INNER JOIN TABELLE2 ON (TABELLE1.Pers_key1 = TABELLE2.key1)
Allerdings kann TABELLE1.Pers_key1 wohl in TABELLE2.key1 oder TABELLE2.key2 vorkommen....
Da gehts bei mir schon ans raten.
Vielleicht so:
SELECT * FROM TABELLE1 JOIN TABELLE2 WHERE (TABELLE1.Pers_key1 = TABELLE2.key1 OR TABELLE1.Pers_key1 = TABELLE2.key2)
g,
disco
das ist kein chat hier. musst dich ggf. etwas gedulden.
hab zwar vor 3 jahren das letzte mal was mit sql zu tun gehabt, aber müsste dass nicht in etwa so aussehen.
SELECT * FROM TABELLE1 INNER JOIN TABELLE2 ON (TABELLE1.Pers_key1 = TABELLE2.key1)
Allerdings kann TABELLE1.Pers_key1 wohl in TABELLE2.key1 oder TABELLE2.key2 vorkommen....
Da gehts bei mir schon ans raten.
Vielleicht so:
SELECT * FROM TABELLE1 JOIN TABELLE2 WHERE (TABELLE1.Pers_key1 = TABELLE2.key1 OR TABELLE1.Pers_key1 = TABELLE2.key2)
g,
disco
Antwort 3 von Marten
ja ich weiß, bin halt nur grad bei der arbeit. dein statement hab ich auch schon versucht. es lautet dann aber:
SELECT *
FROM Tabelle1 INNER JOIN Tabelle2 ON Tabelle1.Pers_key1=Tabelle2.Key1 or Tabelle1.Pers_key1=Tabelle2.Key2;
Sieht dann so aus:
Kdnr----Name--------Vorname----Pers_key1----Key1----Key2----Beziehungsart
2345----Schmidt----Jürgen-------2222-------------1111----2222----abc
2345----Schmidt----Jürgen-------2222-------------2222----3333----xyz
2345----Schmidt----Jürgen-------2222-------------2222----6666----abc
2345----Schmidt----Jürgen-------2222-------------9999----2222----xyz
3456----Peters-------Heiner-------3333-------------2222----3333----xyz
3456----Peters-------Heiner-------3333-------------3333----4444----fgh
3456----Peters-------Heiner-------3333-------------3333----7777----xyz
3456----Peters-------Heiner-------3333-------------7777----3333----abc
Durch die "oder-Verknüpfung" ist es access egal, welcher Schlüssel wo ist. Zudem bräuchte ich ja noch ein zweites Datenfeld mit der Kundennummer des Key2....
SELECT *
FROM Tabelle1 INNER JOIN Tabelle2 ON Tabelle1.Pers_key1=Tabelle2.Key1 or Tabelle1.Pers_key1=Tabelle2.Key2;
Sieht dann so aus:
Kdnr----Name--------Vorname----Pers_key1----Key1----Key2----Beziehungsart
2345----Schmidt----Jürgen-------2222-------------1111----2222----abc
2345----Schmidt----Jürgen-------2222-------------2222----3333----xyz
2345----Schmidt----Jürgen-------2222-------------2222----6666----abc
2345----Schmidt----Jürgen-------2222-------------9999----2222----xyz
3456----Peters-------Heiner-------3333-------------2222----3333----xyz
3456----Peters-------Heiner-------3333-------------3333----4444----fgh
3456----Peters-------Heiner-------3333-------------3333----7777----xyz
3456----Peters-------Heiner-------3333-------------7777----3333----abc
Durch die "oder-Verknüpfung" ist es access egal, welcher Schlüssel wo ist. Zudem bräuchte ich ja noch ein zweites Datenfeld mit der Kundennummer des Key2....
Antwort 4 von TomG
So sollte es gehen
SELECT tabelle1.kdnr, tabelle2.key1, tabelle2.key2, tabelle1a.kdnr as kdnr2, tabelle2.art FROM tabelle2 LEFT JOIN tabelle1 ON tabelle2.key1 = tabelle1.pers_key1 LEFT JOIN tabelle1 as tabelle1a ON tabelle2.key2 = tabelle1a.pers_key1
Gruß
Thomas
SELECT tabelle1.kdnr, tabelle2.key1, tabelle2.key2, tabelle1a.kdnr as kdnr2, tabelle2.art FROM tabelle2 LEFT JOIN tabelle1 ON tabelle2.key1 = tabelle1.pers_key1 LEFT JOIN tabelle1 as tabelle1a ON tabelle2.key2 = tabelle1a.pers_key1
Gruß
Thomas
Antwort 5 von disco
bevor wir da jetzt weitermachen und einen 2ten join einbauen, möchte ich nochmal nachfragen, warum man eine kdnr und einen pers_key1 in der TABELEL1 benörtigt?
und weisst du, dass man statt " SELECT * " auch einzelne Spalten angeben kann?
Auf jeden fall solltest du dir folgende seiten anschauen, wenn du dich weiter mit sql befassen möchtest:
http://sql.1keydata.com/de/sql-syntax.php
und
http://dev.mysql.com/doc/refman/5.1/de/sql-syntax.html
und weisst du, dass man statt " SELECT * " auch einzelne Spalten angeben kann?
Auf jeden fall solltest du dir folgende seiten anschauen, wenn du dich weiter mit sql befassen möchtest:
http://sql.1keydata.com/de/sql-syntax.php
und
http://dev.mysql.com/doc/refman/5.1/de/sql-syntax.html
Antwort 6 von Marten
Hat sich erledigt! Die Lösung ist:
SELECT Tabelle1.kdnr, Tabelle2.key1, Tabelle2.key2, Fiktive_Tabelle.kdnr AS kdnr_2, Tabelle2.beziehungsart
FROM Tabelle1, Tabelle1 AS Fiktive_Tabelle, Tabelle2
WHERE Tabelle2.key1=Tabelle1.Pers_key1 And Tabelle2.key2=Fiktive_Tabelle.pers_key1;
Vielen Dank für die Lösungsansätze!!!
SELECT Tabelle1.kdnr, Tabelle2.key1, Tabelle2.key2, Fiktive_Tabelle.kdnr AS kdnr_2, Tabelle2.beziehungsart
FROM Tabelle1, Tabelle1 AS Fiktive_Tabelle, Tabelle2
WHERE Tabelle2.key1=Tabelle1.Pers_key1 And Tabelle2.key2=Fiktive_Tabelle.pers_key1;
Vielen Dank für die Lösungsansätze!!!
Antwort 7 von TomG
...gerne.
Der Einwand von disco bezüglich der pers_key1 ist berechtigt. Diese wird eigentlich nicht benötigt, außerdem ist dein Datenmodell auch nicht so prickelnd. Anstelle beide Verknüpfungen (key1+key2) in einem Satz zu speichern, wäre es sinnvoller für jede verknüpfung einen satz anzulegen. Diese enthält dann kdnr,key,art
Somit könnten beliebig viele Verknüpfungen erstellt werden. Auch wenn es in Deinem Beispiel vielleicht nicht vorkommt, wäre es für eine Normalisierung der richtige Weg.
Gruß
Thomas
Der Einwand von disco bezüglich der pers_key1 ist berechtigt. Diese wird eigentlich nicht benötigt, außerdem ist dein Datenmodell auch nicht so prickelnd. Anstelle beide Verknüpfungen (key1+key2) in einem Satz zu speichern, wäre es sinnvoller für jede verknüpfung einen satz anzulegen. Diese enthält dann kdnr,key,art
Somit könnten beliebig viele Verknüpfungen erstellt werden. Auch wenn es in Deinem Beispiel vielleicht nicht vorkommt, wäre es für eine Normalisierung der richtige Weg.
Gruß
Thomas

