Ich habe zwei Protokolltabellen, die Änderungen in Datenbankwerten verfolgen und eine Änderungs-ID verwenden, um die einzelnen Änderungen zu verfolgen. z.B.
Tabelle 1:
%Vor%Tabelle 2:
%Vor%Das Ziel wäre, die beiden Tabellen zu kombinieren:
%Vor%Die Idee ist, dass ich für eine gegebene Revision die Werte, die dieser Revision oder der höchsten Revision entsprechen, weniger als diese nehmen würde.
Die SQL-Abfrage, die mir in den Sinn kommt, wäre so ähnlich, als würde man die beiden Tabellen mit Constraint rev1 & lt; rev2 , dann Zeilen mit einer Unterabfrage auswählen, wobei rev1 = max (rev1) für jede angegebene rev2 ist; Verknüpfen dieser Abfrage mit ihrem Gegenstück durch Austausch von rev2 und rev1 ; und schließlich das Herausfiltern von Duplikaten von rev1 = rev2 .
Die Fragen sind:
Es gibt keinen bestimmten Join-Typ, um diese Art von Abfrage zu verarbeiten. Sie müssen es entweder als eine komplexe Abfrage oder programmgesteuert tun. Im Folgenden finden Sie ein Beispiel für PL / PGSQL-Code für dieses Problem unter Verwendung Ihrer Beispieldaten.
%Vor%Dies sollte in O (Länge (Tabelle1) + Länge (Tabelle2)) laufen.
Beachten Sie den heiklen Teil im "CASE WHEN r1.rev = r2.rev": Wir müssen wählen, auf welcher Tabelle wir den Scan für die nächste Iteration fortsetzen. Der richtige Wert ist derjenige mit dem kleinsten rev-Wert hinter dem Cursor, um alle in beiden Tabellen verfügbaren rev-Nummern zu erhalten. Sie könnten sicherlich eine bessere Leistung erzielen, wenn Sie es in C oder C ++ codieren.
Tags und Links sql postgresql