none
Duvida com Select RRS feed

  • Pergunta

  • Pessoal, uma duvida simples: suponha que eu tenho uma tabela x com varios codigos e uma tabela y com  codigos da tabela X, porem nao todos, apenas alguns..queria mostrar os codigos que sao diferentes, ou seja, os codigos que ainda nao preencheram a tabela y..Alguem pode ajudar?Obrigado.. 

    quarta-feira, 7 de março de 2012 13:12

Respostas

  • Bom dia Rafael,

    Você pode usar o NOT IN, lembrando que esse operador tem um desempenho um pouco "pobre". Se sua tabela for muito grande, essa consulta será demorada e pesada para o seru servidor.

    SELECT * FROM TabelaX
    WHERE Codigo NOT IN (SELECT Codigo FROM TabelaY)

    Esse SELECT irá te retornar todos os registros da TabelaX onde o Codigo não exista na TabelaY.

    []'s


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    quarta-feira, 7 de março de 2012 13:38
  • Olá Rafael desenvolvedor,

    Você tem duas soluções para este problema. 

    1° - Usar uma subquery. 

    2° Usar outer  Joins entre as tabelas

    Segue exemplo:

    create table clientes(
    	id int identity(1,1),
    	nome varchar(20)
    )
    go
    insert into clientes values ('dhiego'),('gustavo'),('andre'),('rafael')
    go
    create table pedidos(
    	id int identity(1,1),
    	id_cliente int
    )
    go
    insert into pedidos values (1),(2)
    go
    
    --Problema: Realizar operaçoes com o "not in" é EXTREMAMENTE custoso para o SQL
    select * from clientes where id not in (select id_cliente from pedidos)
    
    go
    
    select * from clientes
    left join pedidos on clientes.id = pedidos.id_cliente
    where pedidos.id is null

    Abraços.

    Se útil, Classifique.



    Dhiego Piroto - MCP | MCTS SQL Server 2008 Developer | Email: dhiegopiroto@gmail.com

    quarta-feira, 7 de março de 2012 13:39

Todas as Respostas

  • Bom dia Rafael,

    Você pode usar o NOT IN, lembrando que esse operador tem um desempenho um pouco "pobre". Se sua tabela for muito grande, essa consulta será demorada e pesada para o seru servidor.

    SELECT * FROM TabelaX
    WHERE Codigo NOT IN (SELECT Codigo FROM TabelaY)

    Esse SELECT irá te retornar todos os registros da TabelaX onde o Codigo não exista na TabelaY.

    []'s


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    quarta-feira, 7 de março de 2012 13:38
  • Olá Rafael desenvolvedor,

    Você tem duas soluções para este problema. 

    1° - Usar uma subquery. 

    2° Usar outer  Joins entre as tabelas

    Segue exemplo:

    create table clientes(
    	id int identity(1,1),
    	nome varchar(20)
    )
    go
    insert into clientes values ('dhiego'),('gustavo'),('andre'),('rafael')
    go
    create table pedidos(
    	id int identity(1,1),
    	id_cliente int
    )
    go
    insert into pedidos values (1),(2)
    go
    
    --Problema: Realizar operaçoes com o "not in" é EXTREMAMENTE custoso para o SQL
    select * from clientes where id not in (select id_cliente from pedidos)
    
    go
    
    select * from clientes
    left join pedidos on clientes.id = pedidos.id_cliente
    where pedidos.id is null

    Abraços.

    Se útil, Classifique.



    Dhiego Piroto - MCP | MCTS SQL Server 2008 Developer | Email: dhiegopiroto@gmail.com

    quarta-feira, 7 de março de 2012 13:39
  • Rafael,

    Uma alternativa mais performática ao uso do IN e NOT IN é você utilizar EXCEPT e INTERSECT.

    Para saber mais: http://msdn.microsoft.com/pt-br/library/ms188055.aspx

    Pode ser útil.


    David Silva | MCITP| MCTS | MCP | ITILF | Blog: http://tilive.wordpress.com

    quarta-feira, 7 de março de 2012 13:49
  • Obrigado a todos...
    quarta-feira, 7 de março de 2012 14:12