Neste artigo veremos os operadores EXISTS e NOT EXISTS estes são mas dois operadores de subquery que testam se uma subquery irá retornar alguma linha, tendo retornado, se da segmento a consulta, caso não a consulta é finalizada.
EXISTS e NOT EXISTS são muito recomendados por causa de sua performance devido a pouca utilização de hardware.
Com os operadores EXISTS e NOT EXISTS é possível a utilização de *. Algumas pessoas sentem dificuldades de utilizar os operadores devido a não entenderem a forma de execução dos mesmo. Vamos a um exemplo:
Eu tenho na tabela A (1,2,3,4,5) e na tabela B (5,6,7) e eu defino na minha subquery que caso exista na tabela B o numero 7 me retorne Select * from A, naturalmente irá me retornar todas as linhas da tabela A. Mas caso eu defina que se na tabela B existir o numero 7 e (And) numero de A = numero de B somente será retornado o numero 5.
Vamos a alguns estudos de caso:
Use GuiaDBA go Create table Projeto (Id_Projeto int Primary key identity(1000,1), sNome_Projeto varchar(50), Id_Area_Projeto int) go Create Table Area_Projeto (Id_Area_Projeto int Primary key identity(100,1), Area varchar(50)) go Create Table Recurso (Id_Recurso int Primary key Identity(10,1), sNome_Recurso varchar(50), Id_Area_Projeto int) Alter Table Projeto add Foreign Key (Id_Area_Projeto) references Area_Projeto (Id_Area_Projeto) go Alter Table Recurso add Foreign Key (Id_Area_Projeto) references Area_Projeto (Id_Area_Projeto) go Insert Into Area_Projeto (Area) values ('Banco de Dados'),('Desenvolvimento'),('Infra Estrutura') go Insert Into Recurso (sNome_Recurso,Id_Area_Projeto) values ('Thiago Cruz', 100),('Alexandre Curvelo',100),('Anderson Nascimento', 102),('Carlos Henrique', 102),('Martha Rezende', 101) go Insert Into Projeto (sNome_Projeto, Id_Area_Projeto) values ('Replicação de Dados',100),('Customização de Pagina Web', 102),('Backup / Restore servidor SQL Server', 101) go
Agora vamos acompanhar como o Exists e Not Exists age:
Select * from Projeto Pro Where Exists (Select * From Area_Projeto are Where Pro.Id_Area_Projeto = 100) -- Indica que Id_Area_Projeto seja 100
Resultado:
Select * From Projeto Pro Where Not Exists (Select * From Area_Projeto are Where Pro.Id_Area_Projeto = 102) -- Indica que Id_Area_Projeto Não seja o 102
Select * -- Seleionar todos os Recursos From Recurso rec Where Exists (Select * From Projeto pro -- Onde o Projeto seja = Replicação de Dados e pro.Id_Area_Projeto = rec.Id_Area_Projeto Where sNome_Projeto = 'Replicação de Dados' And pro.Id_Area_Projeto = rec.Id_Area_Projeto) And Not Exists (Select * From Recurso urs -- Onde o Id_Recurso não seja o 10 Where rec.Id_Recurso = 10)