2010-02-25 9 views
5

Ich versuche zu tun, was es scheint, sollte eine einfache SQL-Operation sein, aber ich finde nur nicht die richtige Syntax, um es schnell zu tun. Ich benutze SQLite.SQL: Schnell den Wert von Spalte B erhalten, wo immer Spalte A ist

Das grundlegende Problem ist, dass ich eine Tabelle habe, deren Primärschlüssel (objUid, Zeit) ist. Es enthält die Spalten objUid, time und frame. Für die Zwecke dieser Frage ist Frame ein undurchsichtiger Wert.

Ich möchte für jedes objUid extrahieren: objUid, minTime, Wert des Rahmens bei minTime, maxTime, Wert des Rahmens bei maxTime.

... und ich möchte es so schnell wie möglich machen.

Ich habe das gerade jetzt, was funktioniert, aber wenn ich die "NATURAL JOIN" -Anweisungen herausnehmen (was bedeutet, dass ich nicht die "Frame" -Spalte bekomme), sind die Dinge etwa doppelt so schnell.

SELECT * FROM (
    SELECT * FROM (
     SELECT objUid, min(time) as minTime, max(time) as maxTime FROM motion GROUP BY objUid 
    ) NATURAL JOIN (
     SELECT objUid, time as minTime, frame as minFrame FROM motion 
    ) 
) NATURAL JOIN (SELECT objUid, time as maxTime, frame as maxFrame FROM motion) 

Irgendwelche Ideen?

Danke!

Antwort

2

Verwendung:

SELECT x.objuid, 
     y.time, 
     y.frame, 
     z.time, 
     z.frame 
    FROM (SELECT m.objuid, 
       MIN(m.time) AS min_time, 
       MAX(m.time) AS max_time 
      FROM MOTION m 
     GROUP BY m.objuid) x 
    JOIN MOTION y ON y.objuid = x.objuid 
       AND y.time = x.min_time 
    JOIN MOTION z ON z.objuid = x.objuid 
       AND z.time = x.max_time 
+0

Ihre Syntax ist auf jeden Fall überlegen Mine (weniger verrückt Verschachtelung), und es scheint, die gleichen Ergebnisse zu erzielen. ... aber es war nicht schneller, als ich es getestet habe. Irgendwelche anderen Zaubertricks in deinem Ärmel? – dianders

+0

@dianders: Ich könnte etwas mit LIMIT sehen, aber bezweifle, dass es für mehr als ein objuid skalierbar wäre. –

+0

Niemals andere Antworten bekommen, und Ihre war hilfreich (und zeigte mir, dass es nicht wirklich offensichtlich war, dass ich fehlte). Deine als "korrekt" kennzeichnen. Vielen Dank! – dianders

Verwandte Themen