Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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 NULLA 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.