Jump to content

Archived

This topic is now archived and is closed to further replies.

jothaz

[Resolvido] Exemplos do uso do NOT EXISTS

Recommended Posts

Os exemplos abaixo mostram como o NOT EXISTS pode ser utilizado.

 

Este operador (se podemos nominá-lo assim) facilita a vida para verificar a existência de resgirtro entre tabelas.

 

Normalmente o DBA´s recomendam o usdo no EXISTS e NOT EXISTS, no lugar do IN, por questões de perfromance.

 

NOT EXISTS EXEMPLO 01

Criando massa de dados para teste:

CREATE TABLE #TABELA1 (SERIAL_NUMBER INT)CREATE TABLE #TABELA2 (SERIAL_NUMBER INT)INSERT INTO #TABELA1 (SERIAL_NUMBER) VALUES (1)INSERT INTO #TABELA1 (SERIAL_NUMBER) VALUES (2)INSERT INTO #TABELA1 (SERIAL_NUMBER) VALUES (3)INSERT INTO #TABELA1 (SERIAL_NUMBER) VALUES (4)INSERT INTO #TABELA2 (SERIAL_NUMBER) VALUES (1)INSERT INTO #TABELA2 (SERIAL_NUMBER) VALUES (3)
A expressão abaixo retorna quais a linhas da TABELA1 não cadastradas na TABELA2,sem a utilização do NOT EXISTS, somente com JOIN- isto é somente um exemplo para se comparar as duas maneiras de executar a mesma operação.

SELECT 		#TABELA1.SERIAL_NUMBERFROM #TABELA1 FULL JOIN #TABELA2 ON #TABELA1.SERIAL_NUMBER = #TABELA2.SERIAL_NUMBER WHERE #TABELA2.SERIAL_NUMBER IS NULL
A expressão abaixo retorna quais a linhas da TABELA1 não cadastradas na TABELA2 utilizando o NOT EXISTS
SELECT 	TABELA1.SERIAL_NUMBERFROM #TABELA1 TABELA1WHERE NOT EXISTS 	(SELECT TABELA2.SERIAL_NUMBER 	FROM #TABELA2 TABELA2 	WHERE TABELA2.SERIAL_NUMBER = TRÁFEGO.SERIAL_NUMBER)

NOT EXISTS EXEMPLO 02

Criando massa de dados para teste:

CREATE TABLE #EMPRESAS (CD_EMPRESA INT,SEQUENCIA INT, SITUACAO  CHAR(1))INSERT INTO #EMPRESAS (CD_EMPRESA ,SEQUENCIA , SITUACAO) VALUES (1,100,'A')INSERT INTO #EMPRESAS (CD_EMPRESA ,SEQUENCIA , SITUACAO) VALUES (2,200,'B')INSERT INTO #EMPRESAS (CD_EMPRESA ,SEQUENCIA , SITUACAO) VALUES (3,300,'C')CREATE TABLE #TABELA_SOCIOS  (MATRICULA INT, CD_EMPRESA INT, SEQUENCIA INT, SITUACAO CHAR(1))INSERT INTO #TABELA_SOCIOS  (MATRICULA, CD_EMPRESA, SEQUENCIA, SITUACAO) VALUES (1,2,600,'A')INSERT INTO #TABELA_SOCIOS  (MATRICULA, CD_EMPRESA, SEQUENCIA, SITUACAO) VALUES (2,2,700,'C')
A expressão abaixo retorna quais a linhas da EMPRESA não cadastradas na TABELA_SOCIOS,sem a utilização do NOT EXISTS, mas utilizando IN - isto é somente um exemplo para se comparar as duas maneiras de executar a mesma operação.

SELECT * FROM #EMPRESAS E   WHERE E.CD_EMPRESA NOT IN (SELECT S.CD_EMPRESA FROM #TABELA_SOCIOS S 	WHERE E.CD_EMPRESA = S.CD_EMPRESA) AND E.SITUACAO = 'A'
A expressão abaixo retorna quais a linhas da EMPRESA não cadastradas na TABELA_SOCIOS utilizando o NOT EXISTS

SELECT * FROM #EMPRESAS E   WHERE NOT EXISTS 	(SELECT S.CD_EMPRESA 	FROM #TABELA_SOCIOS S 	WHERE E.CD_EMPRESA = S.CD_EMPRESA) AND E.SITUACAO = 'A'

Considerações:

[*]Sempre utilize o EXISTS e NOT EXISTS pois é mais eficaz que o IN.

Fonte/Autor/link

AUTOR: "Jothaz"

 

Dúvidas, criticas, contribuições, correções e adições serão bem vindas.

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.