SELECTs dentro de SELECTs em SQL Compact 3.5

Uma das novidades do SQL Compact 3.5 sobre as versões anteriores, é a possibilidade de encadear SELECTs, mas de uma forma mais limitada que o SQL Server 2000/2005/2008.

Hoje precisei de recuperar de uma tabela qual o registo imediatamente anterior/a seguir ao actual para navegar entre eles, sendo que os ID dos registos não era sequencial. Algo como:

ID Nome
1 Joaquim
4 Manuel
9 António
12 Maria
13 Josefina
15 Etelvina
18 Paulo
23 Rui
40 Teresa

(tabela Nomes)

Imaginando que estamos no registo 12, para obter o anterior no SQL Server poderia fazer algo como:

SELECT id, nome
FROM nomes
WHERE id = (SELECT MAX(id) FROM nomes WHERE id < 12)

Ao testar a instrução no SQL Compact, verifica-se que esta sintaxe não é suportada, então lembrei-me de experimentar de outra forma:

SELECT id. nome
FROM nomes INNER JOIN (SELECT MAX(id) qID FROM nomes WHERE id < 12) t
    ON nomes.id = t.qid

E assim já funcionou :)

[ACTUALIZAÇÃO]

Dado que para o meu caso real a pesquisa estava a tomar perto de meio segundo, a que se juntava 0,3 segundos para recuperar o resto da informação e carregar a informação para o ecrã, parti a instrução em 2, o que permitiu ganhar perto de 0,2s. Convém testarem sempre caso-a-caso o que é mais eficiente, uma instrução única como acima, ou partirem-na em 2 para na 1ª recuperar o ID do nome anterior com um ExecuteScalar e depois na 2ª obter os dados do registo.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>