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_?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top