sql abfrage problem verknuepfung zweier tabellen
christian decker
- datenbank
0 sushi0 Kay
0 Daniela Koller
hallole,
wer kann mir sagen wie ich in oracle 7.3.4 eine sql abfrage schreibe
die zwei tabellen miteinander verknuepft.
tabelle eins enthaelt meine kunden. jeder kunde hat eine kundennummer
mit einem speziellen datum.
in tabelle zwei hat jeder kunde mehrer eintraege mit seiner
kundennummer und unterschiedlichen daten.
tabelle eins:
kunde a 12.03.2002
kunde b 14.05.2002
kunde c 01.07.2002
tabelle zwei:
kunde a 14.03.2002
kunde a 10.03.2002
kunde a 21.01.2001
kunde b 14.05.2002
kunde b 01.01.2002
kunde c 11.07.2002
kunde c 06.05.2002
jetzt moechte ich tabelle eins so mit tabelle zwei verknuepfen, daß
jeder kunde mit seiner kundennummer und dem datum daß am naechsten vor
dem datum in tabelle eins liegt verknuepft ist.
ergebnis:
kunde a 12.03.2002 10.03.2002
kunde b 14.05.2002 14.05.2002
kunde c 01.07.2002 06.05.2002
select kunde_1, kunde_2, datum_1, datum_2
from tabelle_1, tabelle_2
where kunde_1 = kunde_2 and ????
wie muß die where bedingung lauten?
gruss und danke
christian
ich tippe auf
select * from table1, table2 where table1.spaltedeinerwahl = table2.spaltedeinerwahl
sushi
Hä, was soll das denn? Da ist keine Abfrage des Datums drin... Sorry, nicht böse sein, aber vielleicht liest du dir einfach nochmal die Frage durch!
MfG, Kay
Hi Christian
jetzt moechte ich tabelle eins so mit tabelle zwei verknuepfen, daß
jeder kunde mit seiner kundennummer und dem datum daß am naechsten vor
dem datum in tabelle eins liegt verknuepft ist.ergebnis:
kunde a 12.03.2002 10.03.2002
kunde b 14.05.2002 14.05.2002
kunde c 01.07.2002 06.05.2002select kunde_1, kunde_2, datum_1, datum_2
from tabelle_1, tabelle_2
where kunde_1 = kunde_2 and ????wie muß die where bedingung lauten?
Du brauchst mehr als nur eine where Bedingung.
Du willst pro Eintrag aus Tabelle a einen eintrag
aus Tabelle b, das hört sich nach einem Grouping an, dann
willst du eine Funktion wie min und max, das hört sich
noch viel mehr nach Grouping an, daraus folgt:
select kunde_1, datum_1, max(datum_2)
from tabelle_1, tabelle_2
where kunde_1 = kunde_2
and datum_2 <= datum_1
group by kunde_1, datum_1
Ich nehme an, du hattest die zwei kunden nur zu debug-Zwecken
drin, die müssen ja identisch sein. Das Group by macht, das du pro kunde und datum jeweils das höchste Datum kriegst, der
zweite Vergleich im Where macht, dass alle Daten, die grösser
als das passende von Tabelle 1 sind, ausgeschlossen werden.
Lies dir dazu auch mal den Tipps und Tricks zu dem Thema durch:
http://aktuell.de.selfhtml.org/tippstricks/datenbanken/having/index.htm
Gruss Daniela
hi daniela,
deine antwort + tips und tricks hat mich erstmal etwas weiter gebracht.
bei den zwei spalten funktioniert das auch prächtig.
jetzt muß ich aber noch weiter spalten der tabelle_2
(z.B. extra_2, kuerzel_2) mit in das query aufnehmen.
tabelle eins:
kunde a 12.03.2002
kunde b 14.05.2002
kunde c 01.07.2002
tabelle zwei:
kunde a 14.03.2002 1234 asd
kunde a 10.03.2002 1432 fed
kunde a 21.01.2001 3455 des
kunde b 14.05.2002 1253 lgk
kunde b 01.01.2002 1243 dbf
kunde c 11.07.2002 3234 sgf
kunde c 06.05.2002 1425 wfd
ergebnis:
kunde a 12.03.2002 10.03.2002 1432 fed
kunde b 14.05.2002 14.05.2002 1253 lgk
kunde c 01.07.2002 06.05.2002 1425 wfd
in deinen tips schreibst du etwas von subquery oder joins.
wie muß mein query dann aussehen? könntest du mir da nochmal helfen?
select kunde_1, datum_1, max(datum_2)
from tabelle_1, tabelle_2
where kunde_1 = kunde_2
and datum_2 <= datum_1
group by kunde_1, datum_1
gruss und danke
christian
Hi Christian
bei den zwei spalten funktioniert das auch prächtig.
jetzt muß ich aber noch weiter spalten der tabelle_2
(z.B. extra_2, kuerzel_2) mit in das query aufnehmen.
ergebnis:
kunde a 12.03.2002 10.03.2002 1432 fed
kunde b 14.05.2002 14.05.2002 1253 lgk
kunde c 01.07.2002 06.05.2002 1425 wfdin deinen tips schreibst du etwas von subquery oder joins.
wie muß mein query dann aussehen? könntest du mir da nochmal helfen?
select a.kunde_1, a.datum_1, b.datum_2, b.spalte1,
b.spalte2
from tabelle_1 a, tabelle_2 b
where a.kunde_1 = b.kunde_2
and b.datum_2 = (select max(c.datum_2)
from tabelle_2 c
where c.kunde_1 = a.kunde_1
and c.datum_2 <= a.datum_1)
Müsste es eigentlich tun, ist aber ungetestet mangels
Oracle und deinen Daten/Datenmodell.
Die innere Query macht, was vorher das Group by
gemacht hat, es holt dir das höchste Datum vom
passenden Kunden das kleiner ist als das gewünschte
Datum. Nur kannst du so genau den richtigen
Datensatz von Tabelle 2 selektieren und somit
auch weitere Felder davon benutzen (angedeutet
mit spalte1, spalte2).
Ich hab den Tabellen Namen gegeben (Buchstaben a, b und
c hinter den Tabellennamen), unter Umständen muss da
noch ein as dazwischen. Das habe ich getan damit er
in der inneren Query kein Durcheinander kriegt welche
der beiden tabelle_2 gemeint ist.
Gruss Daniela
hi daniela,
funktioniert jetzt alles wunderbar.
vielen vielen dank
christian