Hierarchikus adattárolás, egyetlen szülő lekérdezése

Üdv,

Előrebocsátom, hogy nem vagyok SQL-szakértő (sem).
A következőre futottam rá egy program írása során:

Van egy adatbázis tábla, mondjuk a következő mezőkkel:

index, value, option

Az index egy unique érték, a value egy integer, ami nem unique, az option pedig lehet 0 vagy 1.

A feladatom az volna, hogy minden olyan rekordhoz, amelynek az option értéke 0 találjam meg azt a rekordot, aminek a value értéke megegyezik a saját value-éval (tehát itt történik egy self join) és az option értéke 1, az indexe pedig kisebb a sajét indexnél. Eddig még rendben is volna, self-joinnal megkapom az összeset.

Viszont nekem csak egy darab kéne, mégpedig a legnagyobb ilyen indexű.

A legelső, legnaivabb megoldásnak az tűnik, hogy lekérdezem az összes ilyet, utána egy sort segítségével megkeresem a legnagyobbat. És ezt egyesével elvégzem minden olyan rekordra, amelynek 0 az option mezője. Nyilván lassú.

Hogyan lehetne ezt kulturáltan megcsinálni? Alapvetően körülbelül 500000 rekordhoz kéne megcsinálni ezt a párosítást.
Egy SQLite adatbázisról van szó.

Hozzászólások

Hint1:


select a.termekkod, a.ar
from termekarak as a
where arazas_napja = (
   select max( arazas_napja)
   from termekarak as b
   where b.termekkod = a.termekkod
);

Hint2: Indextábla nélkül dögrovás lesz, bárhogy csinálod.

Hint3: Biztos, hogy 500k rekord még az sqlite asztala?

Köszönöm, átgondolom. Az indextáblának utánanézek, micsoda. Az oszlopok amúgy meg vannak indexelve, ugyanis az adatok nem változnak, nem szúrok bele újat.
Postgresql-lel is próbálgatom, sajnos határozottan lassabb. Pedig tud olyanokat, amik jól jönnek. A sebesség meg nem ártana, ha jó lenne.

Nem vagyok egy db guru, de nem lenne jobb a sub query-t atirni, hogy ne fuggjon a kulso querytol? Mert akkor azt eleg lenne a db-nek egyszer lefuttatnia. Vmi ilyesmi (nem teszteltem):


select a.termekkod, a.ar from termekarak a
  join (
    select termekkod, max(arazas_napja) arazas_napja from termekarak group by termekkod
  ) b
  on a.termekkod = b.termekkod and a.arazas_napja = b.arazas_napja