Skeeve: FGA: korrelierte Unterabfragen statt GROUP-BY-Murks

Beitrag lesen

Moin!

gerade wenn man viel mit sql-anweisungen zu tun hat, ist ein schnelles lesen und verstehen der abfrage sehr wichtig.

Vielleicht liegt es daran, daß ich nicht viel mit SQL Abfragen zu tun habe. Meine Abfrage fand ich verständlicher. Das innere SELECT sucht mir alle Gruppen von "name" und "condition" raus und dazu das größte "inserted". zu diesen sucht mir dann das äußere die passenden Values hinzu.

Ich muß allerdings auch sagen, daß ich gerade heute mit so einem Fall zu tun hatte, wo mir auch das hier nicht weitergeholfen hat und ich nur mit der Hilfe eines Kollegen auf die dreistufig Verschachtelte Abfrage zustande bekommen habe.

vereinfachte Ausgangslage
Spalten Name, Vers, Variante, Tstamp
Zu jedem Namen gibt es mehrere Varianten. Jede Kombination davon kann in mehreren Versionen vorliegen. Jede Version wurde zu nahezu demselben Zeitpunkt eingetragen.

Ziel ist nun, die aktuellste Version zu finden, wobei die größe der Versionsnummer nicht maßgeblich ist, sondern der Timestamp

Beispiel:
Name Variante Vers Tstamp
A    1        1    20:00
A    2        1    20:01
A    1        2    21:00
A    2        2    21:01
A    1        3    19:00
A    2        3    19:01
B    1        1    10:00
B    2        1    10:01
B    1        2    11:00
B    2        2    11:01
B    1        3    12:00
B    2        3    12:01

Ergebnis sollte sein
Name Variante Vers Tstamp
A    1        2    21:00
A    2        2    21:01
B    1        3    12:00
B    2        3    12:01

Statement dazu

  
SELECT  
 Name,  
 Variante,  
 Vers,  
 Tstamp  
FROM my_table t1  
WHERE t1.Vers IN  
(  
 SELECT t2.Vers  
 FROM my_table t2  
 WHERE t2.Name = t1.Name  
 AND t2.Tstamp IN  
 (  
  SELECT MAX(t3.Tstamp)  
  FROM my_table t3  
  WHERE t3.Name = t2.Name  
 )  
)  

Ob das auch kürzer geht? Ich bin mir aber relativ sicher: Mit GROUP BY käme ich hier nicht weiter.

Was sagen die 2 Koriphäen?

-- Skeeve