none
not in () RRS feed

  • Pergunta

  •  

     

    Pessoal,

     

    Estou com o seguinte problema, parece fácil e deve ser fácil, mas já estou em low battery de tanto pensar.

     

    tenho que selecionar todos os registro que não existe em outra tabela, mas o not in é para apenas um campo correto? Mas eu tenho duas chaves para validar.

    ex:

     

    select orgao, dia from tabela1 where orgao and dia not in (select orgao, dia from tabela2 )

     

    seria mais ou menos isso.

     

    Alguem poderia dar uma luz?

     

    Rafael Krisller

    quinta-feira, 12 de julho de 2007 20:23

Respostas

  •  

    Olá Rafael,

     

    O NOT IN() deve ser evitado, principalmente se tratando de uma grande quantidade de registro. No seu caso, vai resolver dessa maneira:

     

    Code Snippet
    select orgao, dia
    from tabela1 t1
    LEFT JOIN tabel2 t2 ON T1.orgao = T2.orgao and t1.dia = t2.dia
    where t2.orgao IS NULL

     

     

    Assim, ele vai retornar todos registro da primeira tabela e que não existam na segunda (t2.orgao IS NULL).

     

    Qualquer dúvida, retorne.

     

     

    Abraço

    quinta-feira, 12 de julho de 2007 20:51
  •  

    Rafael,

     

    Você chegou a testar o exemplo que lhe passei??

     

    Ele faz exatamente o que você quer! Veja só:

     

    Tabela1

    Orgao  Dia

    A        |   5

    B        |   8

    C        |   3

     

    Tabela2

    Orgao  Dia

    A        |   5

    B        |   3

     

    O SELECT que te passei está fazendo LEFT JOIN (o LEFT faz com que seja trazidos todos registros da tabela da ESQUERDA[Tabela1] mesmo que não existam na DIREITA[Tabela2]) pelo campo Orgão e Dia. Sendo assim, as informações que NÃO existirem na tabela da DIREITA serão trazidos como NULL. E no WHERE estou forçando para ele trazer APENAS dados da tabela da DIREITA que estejam como NULL, ou seja, não tenham correspondência na tabela da ESQUERDA.

     

    Então, com os dados que estou passando acima, fazendo o JOIN entre as tabelas, vamos ver o que vai acontecer:

    Primeiro registro:

    [ Tabela1 > Orgao A = Tabela2 Orgao A | Tabela1 Dia 5 = Tabela2 Dia 5 ] = no JOIN existe correspondência, MAS no WHERE estou dizendo para trazer apenas os Orgão da Tabela2 esteja NULL, resultado, não será retornado.

     

    Segundo registro:

    [ Tabela1 > Orgao B = Tabela2 Orgao B | Tabela1 Dia 8 = Tabela2 Dia 3 ] = no JOIN NÃO existe correspondência, ou seja, o registro da Tabela2 virá como NULL, exatamente o que tem no WHERE. Resultado, será retornado!

     

    E no terceiro registro, vai acontecer a mesma coisa que no segundo, irá retornar pois não existe corresponência na segunda tabela!

     

     

    O exemplo tem que funcionar perfeitamente. A menos que eu não tenha entendido seu caso!

     

    Grande abraço

    sexta-feira, 13 de julho de 2007 00:59
  •  

    Rafael,

     

    Me desculpe, mas acho que você está fazendo algo errado.

     

    Criei este exemplo, baseado nos dados que você informou:

     

    Code Snippet

    DECLARE @T1 TABLE (ORGAO CHAR(1), DIA INT)
    DECLARE @T2 TABLE (ORGAO CHAR(1), DIA INT)


    INSERT INTO @T1 VALUES ('A',5)
    INSERT INTO @T1 VALUES ('B',8)
    INSERT INTO @T1 VALUES ('C',3)
    INSERT INTO @T1 VALUES ('A',4)
     
    INSERT INTO @T2 VALUES ('A',5)
    INSERT INTO @T2 VALUES ('B',3)

    SELECT T1.ORGAO, T1.DIA
    FROM @T1 T1
    LEFT JOIN @T2 T2 ON T1.ORGAO = T2.ORGAO AND T1.DIA = T2.DIA
    WHERE T2.ORGAO IS NULL

     

     

    Resultado:

    B    |    8

    C    |    3

    A    |    4

     Não é isso que você deseja???

     

     

    Abraço

     

     

    sexta-feira, 13 de julho de 2007 15:20

Todas as Respostas

  •  

    Olá Rafael,

     

    O NOT IN() deve ser evitado, principalmente se tratando de uma grande quantidade de registro. No seu caso, vai resolver dessa maneira:

     

    Code Snippet
    select orgao, dia
    from tabela1 t1
    LEFT JOIN tabel2 t2 ON T1.orgao = T2.orgao and t1.dia = t2.dia
    where t2.orgao IS NULL

     

     

    Assim, ele vai retornar todos registro da primeira tabela e que não existam na segunda (t2.orgao IS NULL).

     

    Qualquer dúvida, retorne.

     

     

    Abraço

    quinta-feira, 12 de julho de 2007 20:51
  •  

     

    Muito obrigado Alexandre, mas essa query só retorna valores dos orgao que não exista na tabela2 , mas esse orgao existe na tabela2 so que o dia não é o mesmo da tabela1.

     

    Eu não queria usar cursor para fazer isso, já que são vários registros da tabela1.

     

     

     

    quinta-feira, 12 de julho de 2007 21:15
  •  

    Rafael,

     

    Você chegou a testar o exemplo que lhe passei??

     

    Ele faz exatamente o que você quer! Veja só:

     

    Tabela1

    Orgao  Dia

    A        |   5

    B        |   8

    C        |   3

     

    Tabela2

    Orgao  Dia

    A        |   5

    B        |   3

     

    O SELECT que te passei está fazendo LEFT JOIN (o LEFT faz com que seja trazidos todos registros da tabela da ESQUERDA[Tabela1] mesmo que não existam na DIREITA[Tabela2]) pelo campo Orgão e Dia. Sendo assim, as informações que NÃO existirem na tabela da DIREITA serão trazidos como NULL. E no WHERE estou forçando para ele trazer APENAS dados da tabela da DIREITA que estejam como NULL, ou seja, não tenham correspondência na tabela da ESQUERDA.

     

    Então, com os dados que estou passando acima, fazendo o JOIN entre as tabelas, vamos ver o que vai acontecer:

    Primeiro registro:

    [ Tabela1 > Orgao A = Tabela2 Orgao A | Tabela1 Dia 5 = Tabela2 Dia 5 ] = no JOIN existe correspondência, MAS no WHERE estou dizendo para trazer apenas os Orgão da Tabela2 esteja NULL, resultado, não será retornado.

     

    Segundo registro:

    [ Tabela1 > Orgao B = Tabela2 Orgao B | Tabela1 Dia 8 = Tabela2 Dia 3 ] = no JOIN NÃO existe correspondência, ou seja, o registro da Tabela2 virá como NULL, exatamente o que tem no WHERE. Resultado, será retornado!

     

    E no terceiro registro, vai acontecer a mesma coisa que no segundo, irá retornar pois não existe corresponência na segunda tabela!

     

     

    O exemplo tem que funcionar perfeitamente. A menos que eu não tenha entendido seu caso!

     

    Grande abraço

    sexta-feira, 13 de julho de 2007 00:59
  •  

     

    Alexandre ,

     

    Agradeço muito a ajuda.

     

    Testei sim seu exemplo e ele retornou os que não existiam, mas deixa eu lhe mostrar outro exemplo que ele não retornará.

     

     

    Tabela1

    Orgao  Dia

    A        |   5

    B        |   8

    C        |   3

    A        |   4

     

     

    Tabela2

    Orgao  Dia

    A        |   5

    B        |   3

     

    Ele retornará o C | 3, mas não retornará o A   |  4, já que A existe na tabela 2.

    Entendeu agora? O orgao e o dia são chaves. Por isso usando Is Null não deu.

     

    Muito Obrigado e Valeu mesmo a ajuda.

     

    Rafael Krisller

     

     

    sexta-feira, 13 de julho de 2007 15:04
  •  

    Rafael,

     

    Me desculpe, mas acho que você está fazendo algo errado.

     

    Criei este exemplo, baseado nos dados que você informou:

     

    Code Snippet

    DECLARE @T1 TABLE (ORGAO CHAR(1), DIA INT)
    DECLARE @T2 TABLE (ORGAO CHAR(1), DIA INT)


    INSERT INTO @T1 VALUES ('A',5)
    INSERT INTO @T1 VALUES ('B',8)
    INSERT INTO @T1 VALUES ('C',3)
    INSERT INTO @T1 VALUES ('A',4)
     
    INSERT INTO @T2 VALUES ('A',5)
    INSERT INTO @T2 VALUES ('B',3)

    SELECT T1.ORGAO, T1.DIA
    FROM @T1 T1
    LEFT JOIN @T2 T2 ON T1.ORGAO = T2.ORGAO AND T1.DIA = T2.DIA
    WHERE T2.ORGAO IS NULL

     

     

    Resultado:

    B    |    8

    C    |    3

    A    |    4

     Não é isso que você deseja???

     

     

    Abraço

     

     

    sexta-feira, 13 de julho de 2007 15:20
  •  

     

    Alexandre ,

     

    Muitissímo obrigado...

     

    Estava fazendo coisa errada mesmo.

     

    Valeu mesmo...

    (Ta marcado como resposta seu post)

     

    Rafael Krisller

    sexta-feira, 13 de julho de 2007 15:33
  •  

    Blz Rafael,

     

    Qualquer coisa estamos aqui.

     

     

    Abraço

    sexta-feira, 13 de julho de 2007 15:36