Probleme beim Erstellen einer speziellen View



  • Folgendes Problem, ich möchte eine View erstellen, die mir aus verschiedenen Tabellen Werte zusammenfügt und mir anzeigt. Das klappt bisher auch schon, die Anzeige sieht dann ungefähr so aus:

    Timestamp - UserName - Version - ServerName - dbName
    01.01.07 ---- Anton ------- 1.1 ------ Server A ----- DB 1
    02.02.07 ---- Berta ------- 1.2 ------ Server A ----- DB 1

    03.03.07 ---- Anton ------- 1.1 ------ Server B ----- DB 1
    03.04.07 ---- Anton ------- 1.2 ------ Server B ----- DB 1
    03.05.07 ---- Anton ------- 1.3 ------ Server B ----- DB 1

    03.03.07 ---- Anton ------- 1.1 ------ Server B ----- DB 2

    Jetzt will ich aber eigentlich, dass er mir zu einem speziellen ServerName und dbName nur die aktuellste Version anzeigt.

    Timestamp - UserName - Version - ServerName - dbName
    02.02.07 ---- Berta ------- 1.2 ------ Server A ----- DB 1
    03.05.07 ---- Anton ------- 1.3 ------ Server B ----- DB 1
    03.03.07 ---- Anton ------- 1.1 ------ Server B ----- DB 2

    Alle meine Versuche bisher endeten im Chaos 😉
    Irgendwie weiß ich nicht, wie ich das angehen soll.

    SELECT     dbo.Tabelle1.Timestamp, dbo.Tabelle1.UserName, dbo.Tabelle2.Version, dbo.Tabelle3.ServerName, 
                          dbo.Tabelle5.dbName
    FROM         dbo.Tabelle3 INNER JOIN
                          dbo.Tabelle1 ON dbo.Tabelle3.ServerID = dbo.Tabelle1.ServerID INNER JOIN
                          dbo.Tabelle2 ON dbo.Tabelle1.ReleaseID = dbo.Tabelle2.ReleaseID INNER JOIN
                          dbo.Tabelle4 ON dbo.Tabelle3.ServerID = dbo.Tabelle4.ServerID AND dbo.Tabelle1.ServerID = dbo.Tabelle4.ServerID AND
                           dbo.Tabelle1.dbID = dbo.Tabelle4.dbID INNER JOIN
                          dbo.Tabelle5 ON dbo.Tabelle4.dbID = dbo.Tabelle5.dbID
    GROUP BY dbo.Tabelle1.Timestamp, dbo.Tabelle1.UserName, dbo.Tabelle2.Version, dbo.Tabelle3.ServerName, 
                          dbo.Tabelle5.dbName
    


  • Bei so einer Fragestellung benötigst Du ein correlated Subquery oder ein Self-join mit einer HAVING-Klausel. Ich mache das hier mal mit dem Self-join vereinfacht mit einer Tabelle:

    SELECT t1.Timestamp, t1.UserName, t1.Version, t1.ServerName, t1.dbName
      FROM Tabelle1 t1
      JOIN Tabelle1 t2
        ON t1.ServerName = t2.ServerName
       AND t1.dbName = t2.dbName
     GROUP BY t1.Timestamp, t1.UserName, t1.Version, t1.ServerName, t1.dbName
    HAVING t1.Timestamp = max(t2.Timestamp)
    


  • Ich bekomm das noch nicht so ganz hin!
    Dein Beispiel versteh ich zwar, aber ich müsste ja dann den kompletten Inhalt meiner INNER JOINS mit dem selbigen nochmal einen JOIN machen. Wie geht das?

    FROM         
    (dbo.Tabelle3 INNER JOIN
                          dbo.Tabelle1 ON dbo.Tabelle3.ServerID = dbo.Tabelle1.ServerID INNER JOIN
                          dbo.Tabelle2 ON dbo.Tabelle1.ReleaseID = dbo.Tabelle2.ReleaseID INNER JOIN
                          dbo.Tabelle4 ON dbo.Tabelle3.ServerID = dbo.Tabelle4.ServerID AND dbo.Tabelle1.ServerID = dbo.Tabelle4.ServerID AND
                           dbo.Tabelle1.dbID = dbo.Tabelle4.dbID INNER JOIN
                          dbo.Tabelle5 ON dbo.Tabelle4.dbID = dbo.Tabelle5.dbID
    ) t1 JOIN
    (dbo.Tabelle3 INNER JOIN
                          dbo.Tabelle1 ON dbo.Tabelle3.ServerID = dbo.Tabelle1.ServerID INNER JOIN
                          dbo.Tabelle2 ON dbo.Tabelle1.ReleaseID = dbo.Tabelle2.ReleaseID INNER JOIN
                          dbo.Tabelle4 ON dbo.Tabelle3.ServerID = dbo.Tabelle4.ServerID AND dbo.Tabelle1.ServerID = dbo.Tabelle4.ServerID AND
                           dbo.Tabelle1.dbID = dbo.Tabelle4.dbID INNER JOIN
                          dbo.Tabelle5 ON dbo.Tabelle4.dbID = dbo.Tabelle5.dbID
    ) t2
    GROUP BY ...
    HAVING ...
    

    Hilfe!
    So klappts auf jeden Fall nicht 😉



  • Du brauchst nur die Tabelle1 ein zweites mal dazujoinen.

    ... FROM Tabelle1 t1
        JOIN Tabelle1 t2 ON ...
        JOIN Tabelle2 ON ...
        JOIN Tabelle3 ON ...
        JOIN Tabelle4 ON ...
        JOIN Tabelle5 ON ...
    


  • Mh, ok, jetzt hab ichs geschafft, bzw. ein Kollege von mir 😉
    Hätte ich wohl noch ein bisschen dran rumgekaut.

    Trotzdem danke!


Anmelden zum Antworten