sql - Why does using "where rownum = 1" not select the first ordered row? -


this weird, use pair of spare eyes understand what's happening.

so have query :

with x (             select num_aula, tipo_aula, min(abs(capienza-1)) score             aula             join (                     select num_aula, tipo_aula                     aula                     tipo_aula = 'laboratorio'                     minus                     select num_aula, tipo_aula                     occr_lezione                     to_char(data_inizio_occr_lezione,'hh24:mi') = '12:30'                     , nome_sede = 'centro direzionale'                     , giorno_lezione = 2                  )             using(num_aula,tipo_aula)             group num_aula, tipo_aula             order score asc ) select * x 

wich return result set :

num tipo_aula                 score --- -------------------- ---------- 1   laboratorio                  35 2   laboratorio                  35 

wich desired result.

now, if add line query :

where rownum = 1; 

wich should return first row of table, :

num tipo_aula                 score --- -------------------- ---------- 2   laboratorio                  35 

how possible ?

i think query want is

with x (     select num_aula,             tipo_aula, min(abs(capienza-1)) score,             row_number() over(partition num_aula, tipo_aula order score asc ) seq     aula     join (         select num_aula, tipo_aula           aula           tipo_aula = 'laboratorio'           minus           select num_aula, tipo_aula             occr_lezione             to_char(data_inizio_occr_lezione,'hh24:mi') = '12:30'             , nome_sede = 'centro direzionale'             , giorno_lezione = 2         )         using(num_aula,tipo_aula) ) select * x x.seq = 1; 

the rownum keyword not behave think, see this article rownum.

to give more details, rownum assigned before order given result set.

if want correct result using rownum keyword, achieve subquery first order, generate rownum actual ordered result set. however, prefer first approach more readable in opinion, free prefer one.

select * (select num_aula,             tipo_aula, min(abs(capienza-1)) score         aula         join (             select num_aula, tipo_aula             aula             tipo_aula = 'laboratorio'             minus                 select num_aula, tipo_aula                 occr_lezione                 to_char(data_inizio_occr_lezione,'hh24:mi') = '12:30'                   , nome_sede = 'centro direzionale'                   , giorno_lezione = 2             ) using(num_aula,tipo_aula)         group num_aula, tipo_aula         order score asc) x x.rownum = 1; 

Comments

Popular posts from this blog

java - Could not locate OpenAL library -

c++ - Delete matches in OpenCV (Keypoints and descriptors) -

sorting - opencl Bitonic sort with 64 bits keys -