so erstellen Sie eine mssql-Ansicht für immer Letzte Status-Informationen
-
03-07-2019 - |
Frage
sagen wir, ich habe zwei Tabellen, eine für das Objekt erfasst und eine für die Aktivität Aufzeichnungen über diese Objekte.
ich bin dem einfügen eines neuen Datensatzes in dieser Aktivität Tabelle jedes mal, wenn ein Objekt eingefügt oder aktualisiert.
sagen, es auf einfache Weise, angenommen ich habe vier Felder in der Aktivität Tabelle;objectId Typ, status und Datum.
wenn ein Objekt aktualisiert werden, ich bin Planung, um den letzten Zustand für das Objekt und den Blick für die änderungen.wenn es einen Unterschied gibt zwischen der Update-Wert und der Vorherige Wert, ich werde den Wert mit neuen Eingang, sonst werde ich ihn null.so zum Beispiel in einem update-Prozess, Benutzer-nur ändert sich der status mit dem Wert des Objekts, sondern lässt der type-Wert als die gleiche ist, so werde ich eine neue Zeile einfügen mit einem null-Wert für geben und einen neuen Wert für den status.
SELECT * FROM Activity; oid type status date ----------------------------------------- 1 0 1 2009.03.05 17:58:07 1 null 2 2009.03.06 07:00:00 1 1 null 2009.03.07 20:18:07 1 3 null 2009.03.08 07:00:00
also ich muss eine Ansicht erstellen, die mir sagt, den aktuellen Zustand des Objekts, wie,
SELECT * FROM ObjectStateView Where oid = 1; oid type status date ----------------------------------------- 1 3 2 2009.03.08 07:00:00
wie kann ich erreichen, this_?
Lösung
Unter der Annahme, Datum verwendet werden kann neuesten Eintrag zu finden:
CREATE VIEW foo
AS
SELECT
A.oid,
(SELECT TOP 1 type FROM Activity At WHERE At.OID = A.oid AND At.Date <= MAX(A.date) AND type IS NOT NULL),
(SELECT TOP 1 status FROM Activity Ast WHERE Ast.OID = A.oid AND Ast.Date <= MAX(A.date) AND status IS NOT NULL),
MAX(A.date) AS date
FROM
Activity A
GO
Edit: Wenn Sie einen JOIN (ungetestet)
CREATE VIEW foo
AS
SELECT TOP 1
A.oid,
At.type,
Ast.status,
A.date
FROM
Activity A
LEFT JOIN
(SELECT TOP 1 oid, date, type FROM Activity WHERE type IS NOT NULL ORDER BY date DESC) At ON A.OID = At.oid
LEFT JOIN
(SELECT TOP 1 oid, date, status FROM Activity WHERE status IS NOT NULL ORDER BY date DESC) Ast ON A.OID = Ast.oid
ORDER BY date DESC
GO
haben Sollte dies früher hinzugefügt:
Es wird exponentiell skaliert, weil Sie die Tabelle 11 verschiedene Zeiten zu berühren haben.
Eine bessere Lösung wäre einen „aktuellen“ Tisch zu halten und sie über einen Trigger auf Aktivität beibehalten.
Andere Tipps
Haben Sie mit in Betracht gezogen MAX Funktion?
select oid, type, status, MAX(date) as max_date
from ObjectStateView
where oid = 1
Nicht wirklich sicher, warum Sie die NULL-Werte in es wollen würde. Sie können verfolgen, was zwischen den Eingängen durch einen Vergleich der neuesten Eintrag zum vorherigen geändert hat. Danach wird der aktuelle Zustand des Objekts ist der neueste Eintrag in der Tabelle. Sie können bestimmen, ob ein Objekt durch die Schaffung eines Hash der Teile des Objekts, das Sie verfolgen möchten Änderungen und Speichern dass als zusätzliche Spalte geändert hat.
Historische Werte:
Da Sie änderungen nachverfolgen möchten, möchten Sie möglicherweise den status des Objekts historisch:
SELECT a.oid,
a.date,
a_type.type,
a_status.status
FROM Activity a
LEFT JOIN Activity a_type
ON a_type.oid = a.oid
AND a_type.date = (SELECT TOP 1 date FROM Activity WHERE oid = a.oid AND date <= a.date AND type IS NOT NULL ORDER BY date DESC)
LEFT JOIN Activity a_status
ON a_status.oid = a.oid
AND a_status.date = (SELECT TOP 1 date FROM Activity where oid = a.oid AND date <= a.date AND status IS NOT NULL ORDER BY date DESC)
die Rückkehr:
oid date type status
----------- ---------- ----------- -----------
1 2009-03-05 0 1
1 2009-03-06 0 2
1 2009-03-07 1 2
1 2009-03-08 3 2
Gegenleistung:
Auf der anderen Seite, wenn Sie mehr als nur ein paar Felder, und der Tisch ist groß, die Leistung würde zu einem Problem werden.In diesem Fall würde ich den Sinn auch zum speichern/Zwischenspeichern der Werte in einer anderen Tabelle MyDataHistory, die würde, die Daten enthalten, die wie in der Tabelle oben gezeigt.Klicken Sie dann auf die aktuelle(Letzte) version ist trivial, mit ein SQL-Ansicht-Filterung die Letzte Zeile (1 Zeile) von oid und Datum.