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.