Announcement

Collapse
No announcement yet.

JOIN ohne Primary Key

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • JOIN ohne Primary Key

    Hallo Leute!

    Ich habe 2 Tabellen die ich miteinander verbinden will aber irgendwie klappt das bei mir nicht weil ich keinen primary key habe, sondern 2 spalten die man kombinieren muss . hier ein beispiel zur verdeutlichung:
    Tabelle 1:
    HTML Code:
    Datum_A	                   Datum_B	Alter	Name
    01.01.2000               02.01.2013	23	Hans
    01.01.1999               02.01.2011	42	Franz
    02.03.2004               02.01.2013	12	Wolfgang
    01.01.2000               01.01.2001	32	Herbert
    01.04.2002               02.03.2004	12	Lisa
    01.01.2000               02.01.2013	11	Maria
    soll mit folgender Tabelle 2 verbunden werden:

    Code:
    Datum_A                 Tage	Referat
    01.01.2000               4750	A
    01.01.1999               4384	B
    02.03.2004               3228	C
    01.01.2000                 366	D
    01.04.2002                 701	E
    Die Spalte "Tage" umschreibt Datum_B: Datum_A+Tage=Datum_B.
    Das Ergebnis würde dann so aussehen:
    Code:
    Datum_A	                   Datum_B	Alter	Name          Referat
    01.01.2000               02.01.2013	23	Hans                   A
    01.01.1999               02.01.2011	42	Franz                  B
    02.03.2004               02.01.2013	12	Wolfgang              C
    01.01.2000               01.01.2001	32	Herbert                D
    01.04.2002               02.03.2004	12	Lisa                     E
    01.01.2000               02.01.2013	11	Maria                   A
    ich habs zuerst einmal mit dem folgenden befehl probiert:

    Code:
    select d1.datum_a,d1.datum_b, d2.Referat from
    tabelle_1 d1
    join tabelle_2 d2 on d1.datum_a=d2.datum_a AND dateadd(days,d2.Tage,d2.datum_a)=d1.datum_a
    MS SQL gibt zwar an dass die tabellen erfolgreich gebunden worden sind, aber in Spalte Referate steht überall "NULL".

    daher hab ich angenommen dass vielleicht der join befehl mit 2 keys nicht funktioniert und habe folgenden code geschrieben:


    Code:
    select d1.datum_a,d1.datum_b, d2.Referat from
    tabelle_1 d1,tabelle_2 d2
    WHERE d1.datum_a=d2.datum_a AND dateadd(days,d2.Tage,d2.datum_a)=d1.datum_a
    hier kommt ebenfalls das gleiche resultat raus.
    und als letztes hab ich auch noch versucht die beiden keys zu vereinen:

    Code:
    select d1.datum_a,d1.datum_b, d2.Referat from
    tabelle_1 d1
    join tabelle_2 d2 on cast(d1.datum_a as char)+cast(d2.datum_a as char)=cast(d2.datum_a as char)+cast(dateadd(days,d2.Tage,d2.datum_a) as char)
    wieder das gleicher ergbenis. d.h. es wird zwar gejoint aber irgendwie sind immer die werte aus der Tabelle 2 "NULL"

    Danke für jede Hilfe!

  • #2
    Der Join funktioniert auch über mehr als eine Spalte, das geht schon.
    Ich mutmaße, dass Du mal bei der letzten Idee weiter probieren solltest und zwar mit Cast(d1.datum) as datetime
    Was ist sind die Datums-Felder denn für Typen?

    Comment


    • #3
      Danke Stefan,
      bei den spalten datum_a und datum_b handelt es sich um smalldatetime, bei "Tage" um int und bei Referat um real. Aber auxh wenn ich in der gebundenen Tabelle die Spalte Tage (statt Referate) mir anschaue steht da auch "NULL"


      habs jetzt auch so probiert:

      Code:
      select d1.datum_a,d1.datum_b, d2.Referat from
      tabelle_1 d1
      join tabelle_2 d2 on 
      cast(d1.datum_a as smalldatetime)=cast(d2.datum_a as smalldatetime) AND
      cast(d1.datum_b as smalldatetime)=cast(dateadd(days,d2.Tage,d2.datum_a) as smalldatetime)
      hilft auch nichts....

      was heisst dieses "NULL" das in jeder zeile dann aufscheint? weil anscheinend wurden ja die tabellen miteinander verbunden. nur die werte von tabelle 2 sind halt nicht sichtbar.
      danke

      Comment


      • #4
        ähm, probierst du statt nur "join" mal "inner join" aus?
        Ein NULL-Wert kommt immer dann, wenn es auf einer Seite der Tabelle bei einem Outer Join keine Entsprechung gibt.
        Es gibt verschiedene Arten von Joins, die du immer spezifizieren musst:
        - Inner Join: nimmt nur Zeilen, bei denen es Entsprechungen in beiden Tabellen gibt
        - Left Outer Join: nimmt alle Zeilen aus der "Linken" Tabelle und nur die passenden aus der "Rechten" Tabelle
        - Right Outer Join: nimmt alle Zeilen aus der "Rechten" Tabelle und nur die passenden aus der "Linken" Tabelle
        - Cross Join: Mischt beide Tabellen

        Comment


        • #5
          Originally posted by umutos View Post
          ich habs zuerst einmal mit dem folgenden befehl probiert:

          [HIGHLIGHT="SQL"]
          select d1.datum_a,d1.datum_b, d2.Referat from
          tabelle_1 d1
          join tabelle_2 d2 on d1.datum_a=d2.datum_a AND dateadd(days,d2.Tage,d2.datum_a)=d1.datum_a
          [/HIGHLIGHT]

          MS SQL gibt zwar an dass die tabellen erfolgreich gebunden worden sind, aber in Spalte Referate steht überall "NULL".
          Nimm einfach die richtige JOIN-bedingung in Zeile 9 (D1.Datum_B anstatt D1.Datum_A)
          [HIGHLIGHT="SQL"]
          select d1.datum_a
          , d1.datum_b
          , "Alter"
          , Name
          , d2.Tage
          , d2.Referat
          from tabelle_1 AS d1
          join tabelle_2 AS d2 on d2.datum_a = d1.datum_a
          AND dateadd(day, d2.Tage,d2.datum_a)=d1.datum_B[/HIGHLIGHT]
          Code:
          datum_a                 datum_b                 Alter       Name                 Referat
          ----------------------- ----------------------- ----------- -------- ----------- -------
          2000-01-01 00:00:00.000 2013-01-02 00:00:00.000 23          Hans     4750        A
          1999-01-01 00:00:00.000 2011-01-02 00:00:00.000 42          Franz    4384        B
          2004-03-02 00:00:00.000 2013-01-02 00:00:00.000 12          Wolfgang 3228        C
          2000-01-01 00:00:00.000 2001-01-01 00:00:00.000 32          Herbert  366         D
          2002-04-01 00:00:00.000 2004-03-02 00:00:00.000 12          Lisa     701         E
          2000-01-01 00:00:00.000 2013-01-02 00:00:00.000 11          Maria    4750        A

          Comment


          • #6
            danke!
            ein kleiner fehler mit großen auswirkungen

            liebe grüße!
            umut

            Comment

            Working...
            X