[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