2016-05-19 13 views
0

Ich habe 3 Tabellen A, B, C in DB2. Sie haben eine Beziehung. A ist die Elterntabelle und B, C sind Kindtabellen.DB2 Max Zeitstempel der Spalten im selben Datensatz

Jede der Tabellen verfügt über eine Timestamp-Spalte, die Änderungen am Datensatz verfolgt. Sagen wir T1, T2, T3.

Ich möchte eine Ansicht schreiben, die alle Datensätze in A, B, C pro Schlüssel (sagen ID-Spalte), so dass ich einen logischen Datensatz aus allen drei Tabellen erhalten. Ich verstehe, dass ich eine linke äußere Verknüpfung mit B und C verwenden kann. Zusammen mit dem logischen Datensatz mit ausgewählten Spalten möchte ich auch das Maximum (T1, T2, T3). Es ist nicht der maximale Zeitstempel einer Spalte in Zeilen, aber innerhalb desselben logischen Datensatzes.

Ich bin nicht in Schreiben von Abfragen, daher brauche Hilfe.

Antwort

1

Kombinieren GREATEST() und VALUE() NULL-Werte beliebig niedrigen Zeitstempel zu ändern:

SELECT a.id, 
GREATEST(
    VALUE(T1, TIMESTAMP '1970-01-01 00:00:00'), 
    VALUE(T2, TIMESTAMP '1970-01-01 00:00:00'), 
    VALUE(T3, TIMESTAMP '1970-01-01 00:00:00') 
)  
FROM a 
LEFT OUTER JOIN b ON a.id = b.id 
LEFT OUTER JOIN c ON a.id = c.id 
+0

Immer noch die gleiche Nullfrage, die ich für die Lösung von Charles erwähnte. Ich mache dieses Maximum (COALESCE (T1, X), COALESCE (T2, X), COALESCE (T3, X)), wobei X ein 1970 TS ist. Macht das Sinn? oder ein kürzeres Formular zur Verfügung? – learninghuman

+0

Pesky 'NULL' verderbt immer den Spaß: Skalarfunktionen geben' NULL' zurück, wenn ein Wert Null ist. – Stavr00

1

es Angenommen ist ein Datensatz pro ID in jeder Tabelle, dann:

select a.id, max(a.T1, b.T2, c.T3) 
from tblA A 
     join tblB B on b.id = a.id 
     join tblC C on c.id = a.id 

Würden Sie geben, was Sie fordern. MAX() gibt einfach den maximalen Wert in der gegebenen Menge zurück. Es hängt von dir ab, woher das Set kommt.

Ohne die Verwendung einer GROUP BY, MAX() hat nur die Menge der Werte aus jeder Zeile in der Ergebnismenge.

+0

Ich brauche die linke äußere Verknüpfung, so versucht, dieses „wählen a.id, max (a.T1, b.T2, c. T3) von tblA Ein linker äußerer Join tblB B auf b.id = a.id linker äußerer Join tblC C auf c.id = a.id "... aber für einen Schlüssel, wenn er in A existiert, B aber nicht in C dann gibt Max Timestamp Null, aber ich will Max von A und B – learninghuman

+0

Verwenden Sie 'koaleszieren (c.t3, 0)' wahrscheinlich brauchen die gleichen auf t2. Möglicherweise muss 0 durch einen gültigen Zeitstempel ersetzt werden. '0001-01-01 00; 01: 00.0000' – Charles