none
Como fazer a diferença entre duas tabelas ou selects? RRS feed

  • Pergunta

  • Olá estou precisando fazer uma consulta onde eu consiga obter todos os registros que estão na tabela A e não estão na tabela B. As tabelas são iguais, porém não tenho nenhum campo ID único, preciso realmente fazer a diferença entras as tabelas.

    Como eu poderia fazer isso no sql server?

    Obrigado
    terça-feira, 16 de outubro de 2007 11:54

Respostas

  • É na verdade eu queria fazer a diferença entre as duas tabelas diretamente, mas isso não é possivel eu creio.

    E acabei fazendo desse mesmo jeito que você colocou.
    Com uma diferença, eu já tinha esses dados em uma tabela, o que fiz foi criar uma tabela exatamente igual a que tinha e acrescentei um campo ID que é auto incremento (Identity) e inseri todos os  registros na nova tabela, assim eles automaticamente ganharam um ID.

    Depois foi preciso apenas fazer assim


    Select * from Tabela1

    Where Tabela1.ID NOT IN (Select ID * from Tabela2)


    de qualquer forma, obrigado Galvão.

    Um abraço.
    terça-feira, 16 de outubro de 2007 13:17

Todas as Respostas

  • Romulo,

     

    Nenhum campo ID, mas qual campo você utilizaria então para servir como base?

    terça-feira, 16 de outubro de 2007 12:33
  • Romulo,

     

    Veja se este exemplo ajuda:

     

    Code Block

    Declare @Tabela1 Table

    (Codigo Int Identity(1,1),

    Descricao VarChar(10))

     

    Declare @Tabela2 Table

    (Codigo Int Identity(1,1),

    Descricao VarChar(10))

     

    Insert Into @Tabela1 Values('Teste1')

    Insert Into @Tabela1 Values('Teste2')

    Insert Into @Tabela1 Values('Teste3')

    Insert Into @Tabela1 Values('Teste4')

    Insert Into @Tabela2 Values('Teste1')

    Insert Into @Tabela2 Values('Teste2')

    Insert Into @Tabela2 Values('Teste3')

    Insert Into @Tabela2 Values('Teste4')

    Insert Into @Tabela2 Values('Teste5')

    Insert Into @Tabela2 Values('Teste6')

    Insert Into @Tabela2 Values('Teste7')

    Insert Into @Tabela2 Values('Teste8')

     

    Select * from @Tabela1

    Where Exists(Select * from @Tabela2)

     

     

    terça-feira, 16 de outubro de 2007 13:03
  • É na verdade eu queria fazer a diferença entre as duas tabelas diretamente, mas isso não é possivel eu creio.

    E acabei fazendo desse mesmo jeito que você colocou.
    Com uma diferença, eu já tinha esses dados em uma tabela, o que fiz foi criar uma tabela exatamente igual a que tinha e acrescentei um campo ID que é auto incremento (Identity) e inseri todos os  registros na nova tabela, assim eles automaticamente ganharam um ID.

    Depois foi preciso apenas fazer assim


    Select * from Tabela1

    Where Tabela1.ID NOT IN (Select ID * from Tabela2)


    de qualquer forma, obrigado Galvão.

    Um abraço.
    terça-feira, 16 de outubro de 2007 13:17
  • Romulo,

     

    Obrigado pelo retorno, se precisar estou a disposição.

     

    terça-feira, 16 de outubro de 2007 16:12
  • Não tem sentido. Sem um "where" dentro do select do exists ele sempre traria todo mundo, porque o retorno do Select * from @Tabela2 sempre traria alguma coisa.

    Tenta

    Select * from @Tabela1 a
    
    Where Exists(Select * from @Tabela2 b where a.Codigo = b.Codigo)

    quarta-feira, 20 de janeiro de 2016 12:04
  • Romulo,

    você pode usar o Merge ele te ajuda com: migração de dados, comparação entre tabelas, entre outros aqui vai um exemplo e o link pra estudo:

    exemplo:

    CREATE TABLE #TAB1 ( ID INT, NOME VARCHAR(10));
    CREATE TABLE #TAB2 ( ID INT, NOME VARCHAR(10));
    
    INSERT INTO #TAB1 VALUES(100, 'MONSTRAO');
    INSERT INTO #TAB1 VALUES(101, 'MLK DOIDO')
    INSERT INTO #TAB1 VALUES(102, 'SHOUGLAS')
    
    INSERT INTO #TAB2 VALUES(103, 'DOUGLAS')
    INSERT INTO #TAB2 VALUES(104, 'MOUGLAS')
    
    SELECT * FROM #TAB1
    SELECT * FROM #TAB2
    
    MERGE #TAB1 AS TAB1 -- DESTINO DAS OPERAÇÕES
    USING #TAB2 AS TAB2 -- FONTE DE DADOS DO DESTINO.
    ON(TAB1.ID = TAB2.ID) -- CLAUSULA PARA JUNTAR #TAB1 E #TAB2
    WHEN NOT MATCHED BY TARGET AND TAB2.NOME LIKE '%S'
    	THEN INSERT(ID,NOME) VALUES(TAB2.ID, TAB2.NOME)
    WHEN MATCHED
    	THEN UPDATE SET TAB1.NOME = TAB2.NOME
    WHEN NOT MATCHED BY SOURCE AND TAB1.NOME LIKE '%S'
    	THEN DELETE
    OUTPUT $ACTION, INSERTED.*, DELETED.*; -- RETORNA UMA LINHA PARA CADA LINHA DO DESTINO QUE É INSERIDA, ATUALIZADA OU EXCLUIDA.

    link: https://technet.microsoft.com/pt-br/library/bb522522%28v=sql.105%29.aspx?f=255&MSPPError=-2147217396

    quarta-feira, 20 de janeiro de 2016 12:18
  • O melhor operador para este caso é o EXCEPT. Vejam o exemplo:

    USE AdventureWorks;
    GO
    SELECT ProductID 
    FROM Production.WorkOrder
    EXCEPT
    SELECT ProductID 
    FROM Production.Product ;
    


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    quarta-feira, 20 de janeiro de 2016 15:51
    Moderador
  • É na verdade eu queria fazer a diferença entre as duas tabelas diretamente, mas isso não é possivel eu creio.

    E acabei fazendo desse mesmo jeito que você colocou.
    Com uma diferença, eu já tinha esses dados em uma tabela, o que fiz foi criar uma tabela exatamente igual a que tinha e acrescentei um campo ID que é auto incremento (Identity) e inseri todos os  registros na nova tabela, assim eles automaticamente ganharam um ID.

    Depois foi preciso apenas fazer assim


    Select * from Tabela1

    Where Tabela1.ID NOT IN (Select ID * from Tabela2)


    de qualquer forma, obrigado Galvão.

    Um abraço.

    Poderia fazer assim 

    Select nome from Tabela1

    EXCEPT

    Select nome from Tabela2

    essa query trara os resultados dos registro da tabela1 que não são iguais na  tenha na tabela2independente se você tiver uma PK. porem vale a pena lembra que os campos em ambos os select devem possuir a mesma quantidade de colunas  

    segunda-feira, 23 de maio de 2016 14:35