none
Exibir uma linha que seja "null" usando "join" RRS feed

  • Pergunta

  •          tab1                                tab2
     Cod            nome              Cod         valor           
       1              Zé1                 1              a
       2              Zé2                 1              b
       3              Zé3                 2              b



    obs:relacionamento 1 para muitos,"Cod" da "tab1" é PK

    agora preciso de uma comando que retorne só "Zé2" e "Zé3"

    -"Zé1" não porque no campo "valor" da "tab2" o valor é "a", mesmo que em outra linha o "valor" seja "b"

    -"Zé2" sim porque ele existe na "tab2" mas no campo "valor" foi atribuído "b" e não há outra linha onde "valor" seja "a"

    -"Zé3" sim porque o "Cod" dele naum existe na "tab2"

    Obrigado pela ajuda desde já.
    • Tipo Alterado Gustavo Maia Aguiar segunda-feira, 14 de junho de 2010 00:54 É uma dúvida e não uma alteração
    sábado, 12 de junho de 2010 14:44

Todas as Respostas

  • Chipoca

    Vc deve usar um left join e no where fazer ofiltro retirando o A, segue exemplo

    declare @tab1 as table (cod int, nome varchar(20))
    declare @tab2 as table (cod int, valor varchar(20))
    
    insert into @tab1 values (1,'Ze1')
    insert into @tab1 values (2,'Ze2')
    insert into @tab1 values (3,'Ze3')
    insert into @tab2 values (1,'a')
    insert into @tab2 values (1,'b')
    insert into @tab2 values (2,'b')
    
    select a.*,b.* from @tab1 a left join @tab2 b on a.cod = b.cod
    where b.valor <> 'a' 
    

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    segunda-feira, 14 de junho de 2010 10:27
  • Fala Marcelão,

    Da forma como você passou vai retornar também o Cod 1 que ele não quer e não retornaria o Cod 3 que ele quer.

    Baseado no seu exemplo acho que ele pode usar assim:

    declare @tab1 as table (cod int, nome varchar(20))
    declare @tab2 as table (cod int, valor varchar(20))
    
    insert into @tab1 values (1,'Ze1')
    insert into @tab1 values (2,'Ze2')
    insert into @tab1 values (3,'Ze3')
    insert into @tab2 values (1,'a')
    insert into @tab2 values (1,'b')
    insert into @tab2 values (2,'b')
    
    
    Select Todos.cod,Todos.nome,Todos.valor from (
    	Select a.*,b.valor 
    	from @tab1 a left join @tab2 b on a.cod = b.cod
    	where 
    		(b.valor <> 'a') or
    		(a.cod not in (select c.cod from @tab2 c))) Todos
    Inner join (
    	Select * from @tab2 where valor = 'a') Eliminar on Todos.cod <> Eliminar.cod

     



    http://ricardomura.spaces.live.com
    segunda-feira, 14 de junho de 2010 13:56