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 103.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 103.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 2Alle 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!