Zusammenführen von zwei Versionsverfolgungstabellen beim Ausfüllen von Werten

8

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:

  • Gibt es einen Namen für diese Art von Join?
  • Gibt es ein Idiom zum Ausführen dieser Art von Join in SQL, oder wäre es besser, es programmatisch zu machen (was sicherlich viel einfacher und möglicherweise effizienter wäre)?
Nan L 19.10.2012, 22:22
quelle

3 Antworten

2

SQL Fiddle

%Vor%     
Clodoaldo Neto 25.10.2012, 20:26
quelle
1

Dies kann durch Unterabfragen erreicht werden

%Vor%     
Prasanna 23.10.2012 07:54
quelle
0

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.

    
didierc 25.10.2012 16:52
quelle

Tags und Links