christian decker: sql abfrage problem verknuepfung zweier tabellen

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

  1. ich tippe auf

    select * from table1, table2 where table1.spaltedeinerwahl = table2.spaltedeinerwahl

    sushi

    1. 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

  2. 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.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?

    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

    --
    Nein, wir frieren unsere Hühner nicht auf Gletschern fest.
    Selfcode: sh:) fo:) ch:) rl:) br:> n4:| ie:{ mo:) va:) de:] zu:} fl:( ss:) ls:&
    1. 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

      1. 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  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 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

        --
        Nein, wir frieren unsere Hühner nicht auf Gletschern fest.
        Selfcode: sh:) fo:) ch:) rl:) br:> n4:| ie:{ mo:) va:) de:] zu:} fl:( ss:) ls:&
        1. hi daniela,

          funktioniert jetzt alles wunderbar.

          vielen vielen dank
          christian