6 meses depois do ltimo post (e com o planejamento de ano novo completamente furado o de postar pelo menos 1 vez a cada 15 dias 🙁 )
Dica rpida para quem usar EXISTS :
Nunca utilize uma funo de agregao quando utilizar o EXISTS. Por qu?
Segue um script rpido que insere alguns poucos registros em uma tabela para testarmos…
1 2 3 4 5 6 7 8 9 10 11 12 13 |
CREATE DATABASE TesteExists GO USE TesteExists GO CREATE TABLE Pessoa (Nome varchar(20), Nascimento datetime, Sexo char(1), CPF varchar(11), EstadoCivil char(1)) GO INSERT INTO Pessoa Values ('Logan', '19810101', 'M', '11111111111','C') INSERT INTO Pessoa Values ('Denise','19800101', 'F', '22222222222','C') INSERT INTO Pessoa Values ('Sophia', '20120101', 'F', NULL,'S') GO IF EXISTS (SELECT MAX(Nascimento) FROM Pessoa WHERE nome = 'xxxxx') SELECT 'OK' ELSE SELECT 'NOK' |
“Estranho”, n?
Agora removam o count e executem novamente… Podem substituir o count por MIN, MAX, etc…
Viram o resultado?
Isso ocorre, pois toda a funo de agregao retorna uma linha, sempre(O NULL uma linha), e o EXISTS verifica se a subconsulta retornou qualquer linha. Se retornou, TRUE e portanto nunca vai executar o ELSE.
Vejam a diferena:
Ficou claro que um retorna uma linha e o outro no retorna nada? Ainda no?
Ento, fica a dica…
Nunca utilize uma funo de agregao quando utilizar o EXISTS.