[firebase-br] curiosidade e CUIDADO com o First
PedroRS UOL
alex.uol em uol.com.br
Seg Ago 28 19:37:15 -03 2006
Certamente os mestres desta lista conhecem esse capricho do Firebird, mas
quero compartilhar essa experiência com o todos.
Vale a pena ler o que vou descrever abaixo:
Sabemos que “SELECT FIRST 10 CHAVE_PRIMARIA FROM TABELA” retorna somente
os 10 primeiro registros da TABELA
Bem, é natural voce pensar que a declaração abaixo faça a mesma coisa:
“SELECT CHAVE_PRIMARIA FROM TABELA WHERE CHAVE_PRIMARIA IN (SELECT FIRST 10
CHAVE_PRIMARIA FROM TABELA)”
Ou seja, traria somente os 10 primeiros registros.
Mas não é assim que funciona. Na verdade a declaracao acima traz TODOS
registros da TABELA
Descobri isso qdo todos os registros da minha TABELA foram apagados com a
declaracao abaixo:
DELETE FROM TABELA WHERE CHAVE PRIMARIA IN (SELECT FIRST 10 CHAVE_PRIMARIA
FROM TABELA)
.....eu queria apagar somente os 10 primeiros registros....sniff....
sniff....( mas eu tinha backup!!!!!)
Bem, antes de postar isso na lista, procurei ler melhor o Releasenotes do FB
1.5.108 (pág.29) e descobri isso :
“
Dois problemas com SELECT FIRST
1. O comando abaixo:
delete from TAB1 where PK1 in (select first 10 PK1 from TAB1);
apagará todos os registros da tabela. Nossa! O “sub-select” marca as
primeiras 10 linhas para
eliminação, apaga-as, marca as próximas 10, apaga-as, e assim sucessivamente
até que não existam
mais linhas disponíveis na tabela.
Cuidado!
2. Queries como esta:
...
WHERE F1 IN ( SELECT FIRST 5 F2 FROM TABLE2 ORDER BY 1 DESC )
não funcionam como esperado, por causa da otimização processada atualmente
pelo servidor que trata
os predicados correlacionados WHERE...IN (SELECT...) em predicados
correlacionados EXISTS. É óbvio
que neste contexto FIRST N não faz qualquer sentido:
WHERE EXISTS (
SELECT FIRST 5 TABLE2.F2 FROM TABLE2
WHERE TABLE2.F2 = TABLE1.F1 ORDER BY 1 DESC )
“
Engº Pedro Alexandro Ramos dos Santos
RS Sistemas de Informática Ltda
Mais detalhes sobre a lista de discussão lista