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 rápida para quem usar EXISTS :
Nunca utilize uma função de agregação quando utilizar o EXISTS. Por quê?
Segue um script rápido 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 --Super original, não? :-) 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 função de agregação 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 diferença:
Ficou claro que um retorna uma linha e o outro não retorna nada? Ainda não?
Então, fica a dica…
Nunca utilize uma função de agregação quando utilizar o EXISTS.