Announcement

Collapse
No announcement yet.

Unterabfrage oder JOIN? - zwei Tabellen

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

  • Unterabfrage oder JOIN? - zwei Tabellen

    Hallo,

    und zwar geht es bei meinem Fall um eine MSSQL 2000 Abfrage.

    Ich habe eine Datenbank mit zwei Tabellen -> Adressen und Aktionen

    Ich möchte nun alle Adressen ausgegeben bekommen, wo nach 01.01.2008 eine Aktion gemacht wurde. Und hier möchte ich nur die aktuellste Aktion ausgegeben bekommen.

    Bspl.
    Adresse 1 - Aktion XY - 05.05.2008 --> ausgeben
    Adresse 2 - 0 Aktionen in der Datenbank --> nicht ausgeben, da keine Aktionen
    Adresse 3 - Aktion Bla - 12.12.2007 --> nicht ausgeben, da Aktion zu alt

    Einer Adresse können mehrere Aktionen zugeordnert sein, aber wie gesagt, es soll zu der Adresse nur die neuste angezeigt werden.

    Wie kann man das umsetzen? Habe da schon einiges Probiert, bin aber zu keinen 100% Erfolg gekommen, ich habe immer wieder Datensetze enthalten, die nicht stimmen, also wo die Aktion nicht zur Adresse passt usw.

    Hier mein akt. Abfrage Code:
    Code:
    SELECT     Tabelle1.Adresse, Tabelle2.Erfassungsdatum
    FROM       Tabelle1 
    CROSS JOIN Tabelle2
    WHERE      (Tabelle2.Erfassungsdatum =
                 (SELECT     TOP 1 (Erfassungsdatum)
                  FROM          Tabelle2
                  WHERE      Tabelle1.Adresse = Tabelle2.Herkunft))
    ORDER BY   Tabelle1.Adresse

    Danke für eure Hilfe!
    Gruß

  • #2
    siehe: Abfrage mit auswahl der größten Zahl zu den Namen
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Originally posted by samke View Post
      Hallo,

      und zwar geht es bei meinem Fall um eine MSSQL 2000 Abfrage.

      Ich habe eine Datenbank mit zwei Tabellen -> Adressen und Aktionen

      Ich möchte nun alle Adressen ausgegeben bekommen, wo nach 01.01.2008 eine Aktion gemacht wurde. Und hier möchte ich nur die aktuellste Aktion ausgegeben bekommen.

      Bspl.
      Adresse 1 - Aktion XY - 05.05.2008 --> ausgeben
      Adresse 2 - 0 Aktionen in der Datenbank --> nicht ausgeben, da keine Aktionen
      Adresse 3 - Aktion Bla - 12.12.2007 --> nicht ausgeben, da Aktion zu alt

      Einer Adresse können mehrere Aktionen zugeordnert sein, aber wie gesagt, es soll zu der Adresse nur die neuste angezeigt werden.

      Wie kann man das umsetzen? Habe da schon einiges Probiert, bin aber zu keinen 100% Erfolg gekommen, ich habe immer wieder Datensetze enthalten, die nicht stimmen, also wo die Aktion nicht zur Adresse passt usw.

      Hier mein akt. Abfrage Code:
      Code:
      SELECT     Tabelle1.Adresse, Tabelle2.Erfassungsdatum
      FROM       Tabelle1 
      CROSS JOIN Tabelle2
      WHERE      (Tabelle2.Erfassungsdatum =
                   (SELECT     TOP 1 (Erfassungsdatum)
                    FROM          Tabelle2
                    WHERE      Tabelle1.Adresse = Tabelle2.Herkunft))
      ORDER BY   Tabelle1.Adresse

      Danke für eure Hilfe!
      Gruß
      Ein Versuch
      [Highlight="SQL"]SELECT t1.Adresse, t1.Erfassungsdatum
      FROM Tabelle1 AS t1
      JOIN (SELECT MAX (Erfassungsdatum) AS MaxDate
      , Herkunft
      FROM Tabelle2
      ) AS t2 ON T1.Adresse = T2.Herkunft
      WHERE (T2.Erfassungsdatum > CONVERT (DATETIME, '2008-01-01', 120)
      ORDER BY T1.Adresse[/Highlight]

      Comment


      • #4
        Originally posted by ebis View Post
        Ein Versuch
        [Highlight="SQL"]SELECT t1.Adresse, t1.Erfassungsdatum
        FROM Tabelle1 AS t1
        JOIN (SELECT MAX (Erfassungsdatum) AS MaxDate
        , Herkunft
        FROM Tabelle2
        ) AS t2 ON T1.Adresse = T2.Herkunft
        WHERE (T2.Erfassungsdatum > CONVERT (DATETIME, '2008-01-01', 120)
        ORDER BY T1.Adresse[/Highlight]
        Hallo, danke für die Antwort, aber das funktioniert so leider noch nicht richtig.

        Das Erfassungsdatum ist ja in Tabelle2 - du hast das bei Select in t1 gesteckt. Wenn ich das auf t2 ändere findet er die Tabelle nicht. Wenn ich die unter From mit aufführe kommt allerdings auch kein Ergebnis.


        Vielleicht habe ich mich ja auch falsch ausgedruckt.
        Tabelle 1 -> Nur die Adresse
        Tabelle 2 -> die Aktionen, mit Herkunft (für die Verknüpfung zur Adresse), Name und Erfassungsdatum.

        Ich will alle Adessen aus Tabelle 1 mit der letzten Aktion (Name, Datum) die zu der Adresse passt. Wenn es zu einer Adresse keine Aktion gibt, soll die Adresse nicht ausgeben werden.

        Sorry, bin nicht so der "Held" in MSSQL


        Gruß

        Comment


        • #5
          Originally posted by samke View Post
          Hallo, danke für die Antwort, aber das funktioniert so leider noch nicht richtig.

          Das Erfassungsdatum ist ja in Tabelle2 - du hast das bei Select in t1 gesteckt. Wenn ich das auf t2 ändere findet er die Tabelle nicht. Wenn ich die unter From mit aufführe kommt allerdings auch kein Ergebnis.


          Vielleicht habe ich mich ja auch falsch ausgedruckt.
          Tabelle 1 -> Nur die Adresse
          Tabelle 2 -> die Aktionen, mit Herkunft (für die Verknüpfung zur Adresse), Name und Erfassungsdatum.

          Ich will alle Adessen aus Tabelle 1 mit der letzten Aktion (Name, Datum) die zu der Adresse passt. Wenn es zu einer Adresse keine Aktion gibt, soll die Adresse nicht ausgeben werden.

          Sorry, bin nicht so der "Held" in MSSQL
          Gruß
          zugegeben: Erfassungsdatum wird zu MaxDate und ein Group By sollte man auch noch machen
          [Highlight="SQL"]SELECT t1.Adresse, t2.MaxDate
          FROM Tabelle1 AS t1
          JOIN (SELECT MAX (Erfassungsdatum) AS MaxDate
          , Herkunft
          FROM Tabelle2
          GROUP BY Herkunft
          ) AS t2 ON T1.Adresse = T2.Herkunft
          WHERE (T2.MaxDate > CONVERT (DATETIME, '2008-01-01', 120)
          ORDER BY T1.Adresse
          [/Highlight]

          Comment


          • #6
            Super, das scheint zu klappen. Jetzt ist noch die Frage, wie ich weitere Werte aus der Tabelle Aktionen mit ausgebe kann. Also es gibt zu den Aktionen halt noch Werte wie z.B. Art, Ort usw.

            Wie macht man das? Wenn ich das wie folgt mache, erhalte ich in der Ausgabe, Adressen mehrfach, so oft er wohl gleiche Werte anhand der neuen Felder findet in der Aktion Tabelle findet. Wenn ich die Felder bei Group BY allerdings wegneheme, läuft das ganze auf einen Fehler?!


            SELECT t1.Adresse, t2.MaxDate, t2.Ort
            FROM Tabelle1 AS t1
            JOIN (SELECT MAX (Erfassungsdatum) AS MaxDate, Herkunft, Ort
            FROM Tabelle2
            GROUP BY Herkunft, Ort
            ) AS t2 ON T1.Adresse = T2.Herkunft
            WHERE (T2.MaxDate > CONVERT (DATETIME, '2008-01-01', 120)
            ORDER BY T1.Adresse


            Schon mal vielen Dank!!!
            Zuletzt editiert von samke; 02.04.2009, 20:07.

            Comment


            • #7
              unter der voraussetung das Max (Erfasungsdatum) und Herkunft eindeutig sind würd ich mal folgendes probieren:

              [Highlight="SQL"]SELECT t1.Adresse, t2.MaxDate, t3 Ort
              FROM Tabelle1 AS t1
              JOIN (SELECT MAX (Erfassungsdatum) AS MaxDate, Herkunft
              FROM Tabelle2
              GROUP BY Herkunf
              ) AS t2 ON T1.Adresse = T2.Herkunft
              JOIN Tabelle2 AS T3 ON T3.Herkunft = T2.Herkunft
              AND T3.Erfassungsdatum = t2.Maxdate
              WHERE (T2.MaxDate > CONVERT (DATETIME, '2008-01-01', 120)
              ORDER BY T1.Adresse
              [/HIGHLIGHT]

              PS SQL-Code formatiert man so
              [HIGHLIGHT="SQL"] Select .... [/HIGHLIGHT]

              Comment


              • #8
                Originally posted by ebis View Post
                unter der voraussetung das Max (Erfasungsdatum) und Herkunft eindeutig sind
                ...

                Bei den ersten Tests gerade sahen die Daten bzw. das Ergebnis garnicht mal schlecht aus. 100pro konnte ich das jetzt aber noch nicht durchtesten.

                Ja wie meinst eindeutig? Herkunft kann es unter Aktionen mehrfach geben, ist aber eindeutig zur Tabelle Kontakte. Das Erfassungsdatum kann es in der Tabelle Aktionen theoretisch auch mehrfach geben.
                Es gebe sonst in der Tabelle Aktionen halt auch noch eine ID für jeder Aktion, vielleicht sollte man das lieber mit der machen?

                Oder wie meinst du das?


                Sorry wegen dem SQL-Code formatieren...

                Comment


                • #9
                  Hab die Daten nun noch mal geprüft - alles bestens.

                  Vielen Dank für die Hilfe!!! Super!

                  Schönes We
                  Gruß

                  Comment

                  Working...
                  X