Piszę funkcję w ColdFusion, która zwraca pierwszą parę rekordów, które pasują do danych wprowadzonych przez użytkownika, a także całkowitą liczbę pasujących rekordów w całej bazie danych. Ta funkcja zostanie wykorzystana do podania autouzupełniania, więc szybkość/efektywność są jej najważniejszymi problemami. Na przykład, jeśli funkcja otrzymuje dane wejściowe "bl"
, to może powrócić {sampleMatches:["blue", "blade", "blunt"], totalMatches:5000}
skutecznie odnajduję podzbiór rekordów oraz liczbę całkowitą
próbowałem to zrobić w jednym zapytaniu do celów prędkości, a zakończył się z czymś, co wyglądało tak:
select record, count(*) over()
from table
where criteria like :criteria
and rownum <= :desiredCount
Problem z tym rozwiązaniem jest to, że count(*) over()
zawsze zwraca wartość :desiredCount
. Widziałem podobne pytanie do mojego here, ale moja aplikacja nie ma uprawnień do utworzenia tabeli tymczasowej. Czy istnieje sposób na rozwiązanie mojego problemu w jednym zapytaniu? Czy istnieje lepszy sposób na rozwiązanie tego problemu? Dzięki!
"Twoje kryteria" będą ograniczone do zestawu kryteriów, o których wiesz, że możesz używać indeksu? Jeśli użytkownik może ustawić dowolne szalone kryteria, wykona wiele pełnych skanów. – tbone
Z ciekawości, czy funkcja ma być używana do autouzupełniania, jaki jest cel liczenia? –
@tbone kolumna kryteriów jest już zindeksowana – Josh