none
como faço select entre 2 tabelas RRS feed

  • Pergunta

  • <p>Boa tarde,</p><p>Tenho duas tabelas relacionadas com chave estrangeira e necessito fazer um select da seguinte forma:</p><p>retornar todos o registros da tabela A (que tem chave estrangeira na tabela B, tendo ou&nbsp;não um registro na tabela B. left jon?)&nbsp;e ainda atendendo uma&nbsp;condição de outro campo diferente da chave estrangeira na tabela B.</p><p>tipo: select todos_cod_da_tabA from tabA left join TabB on&nbsp;&nbsp;cod_tabA = cod_TabB&nbsp;where TabB.campo_situacao TabB = 'fechada'</p><p><span style="font-size:small;"> </span></p><p><span style="font-size:small;">Ou seja, o que preciso de verdade é retornar apenas valores que tenham o campo situcao &lt;&gt; 'fechada'</span></p>

    SANTOS

    quinta-feira, 13 de setembro de 2012 21:14

Respostas

  • Agora deu pra entender, rs.

    Seguindo a mesma linha do exemplo anterior, o resultado abaixo não retornará o registro de código 10, pois este possui referência na TabelaB com situação 'Fechada'.

    Todos os outros registros serão retornados. Ou porque nem possuem referência na TabelaB ou porque possuem referência com situação 'Aberta'.

    Declare @TabelaA Table (Codigo int)
    Declare @TabelaB Table (Codigo int, Situacao VarChar(10))
    
    Insert Into @TabelaA Values (10), (20), (30), (40)
    Insert Into @TabelaB Values (10, 'Fechado'), (20, 'Aberto'), (30, Null)
    
    -- Maneira 1
    Select
      A.Codigo
    From
      @TabelaA A Left Join @TabelaB B on (A.Codigo = B.Codigo) and (B.Situacao = 'Fechado')
    Where
      (B.Codigo is Null)
      
    -- Maneira 2
    Select
      *
    From
      @TabelaA A
    Where
       (not Exists(Select
                     *
                   From
                     @TabelaB B
                   Where
                     (B.Codigo = A.Codigo) and
                     (B.Situacao = 'Fechado')))


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta SSANTOS sexta-feira, 14 de setembro de 2012 13:35
    sexta-feira, 14 de setembro de 2012 10:57
    Moderador

Todas as Respostas

  • Santos, seria isto mesmo, faria um select * na tabela A usando um left join na tabela B e o where B.campo_situacao = 'fechada'

    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 13 de setembro de 2012 21:30
  • Se existe a condição de igual na tabela B então você anula o Left Join.

    Ou você filtra a situação da tabela B (campo = 'fechada') ou você usa o Left Join. Os dois não dá. Um contradiz o outro.

    Veja que no exemplo abaixo, apesar de estar sendo utilizado o Left Join, não serão retornados todos os registros da TabelaA, pois eu utilizei uma comparação de igualdade com um campo da TabelaB. Dessa forma, o Left Join acabou tendo o mesmo funcionamento do Inner Join (você pode substituir para testar).

    Declare @TabelaA Table (Codigo int)
    Declare @TabelaB Table (Codigo int, Situacao VarChar(10))
    
    Insert Into @TabelaA Values (10), (20), (30), (40)
    Insert Into @TabelaB Values (10, 'Fechado'), (20, 'Aberto'), (30, Null)
    
    Select
      *
    From
      @TabelaA A Left Join @TabelaB B on (A.Codigo = B.Codigo)
    Where
      (B.Situacao = 'Fechado')

    Então, se você quer todos os registros da TabelaA, independente de existir correspondência na TabelaB, use o Left Join, sem filtrar no Where informação da TabelaB.

    Agora, se é verdadeira e correta a condição de que só devem ser retornados os registros cuja situação seja 'fechada', filtre iso no Where (como está fazendo), mas utilize Inner Join na ligação entre as tabelas.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 13 de setembro de 2012 22:37
    Moderador
  • <p>Boa tarde,</p><p>Tenho duas tabelas relacionadas com chave estrangeira e necessito fazer um select da seguinte forma:</p><p>retornar todos o registros da tabela A (que tem chave estrangeira na tabela B, tendo ou&nbsp;não um registro na tabela B. left jon?)&nbsp;e ainda atendendo uma&nbsp;condição de outro campo diferente da chave estrangeira na tabela B.</p><p>tipo: select todos_cod_da_tabA from tabA left join TabB on&nbsp;&nbsp;cod_tabA = cod_TabB&nbsp;where TabB.campo_situacao TabB = 'fechada'</p><p><span style="font-size:small;"> </span></p><p><span style="font-size:small;">Ou seja, o que preciso de verdade é retornar apenas valores que tenham o campo situcao &lt;&gt; 'fechada'</span></p>

    SANTOS

    Senhores obrigado pelas respostas.

    O texto acima ficou estranho, mas vou por o que estou usando para ver se me faço entender:

    SELECT CadLaudoEntrada.codLaudo, CadLaudoEntrada.placaVeiculoCli + ' Laudo = ' +

    CAST(CadLaudoEntrada.codLaudo AS varchar)

    + ' ' + CadLaudoEntrada.Tipo AS placa FROM CadLaudoEntrada left JOIN CadOrdemServico ON (CadLaudoEntrada.codLaudo = CadOrdemServico.codLaudo) WHERE (CadOrdemServico.situacao <> 'FECHADA') ORDER BY CadLaudoEntrada.Data DESC

    Seja utilizando inner join ou left join, retorna apenas 2 dos 3  registros que existem na tabela B (se mudo o sinal de <> para = 'fechada' retorna apenas 1) 

    O que preciso, é que retorne todos os registros que estão na tabela A cujo correspondente na tabela B NÃO tenha a condição de 'fechada'.

    resumo:

    tabela A = 10 registros

    tabela B = 3 registros (2 situação = 'aberta' e 1 situação = 'fechada')

    retorno: 9 registros (7 sem correspondência na tabela B e 2 com correspondência na tabela B)

    Espero ter explicado melhor.


    SANTOS

    sexta-feira, 14 de setembro de 2012 03:12
  • Agora deu pra entender, rs.

    Seguindo a mesma linha do exemplo anterior, o resultado abaixo não retornará o registro de código 10, pois este possui referência na TabelaB com situação 'Fechada'.

    Todos os outros registros serão retornados. Ou porque nem possuem referência na TabelaB ou porque possuem referência com situação 'Aberta'.

    Declare @TabelaA Table (Codigo int)
    Declare @TabelaB Table (Codigo int, Situacao VarChar(10))
    
    Insert Into @TabelaA Values (10), (20), (30), (40)
    Insert Into @TabelaB Values (10, 'Fechado'), (20, 'Aberto'), (30, Null)
    
    -- Maneira 1
    Select
      A.Codigo
    From
      @TabelaA A Left Join @TabelaB B on (A.Codigo = B.Codigo) and (B.Situacao = 'Fechado')
    Where
      (B.Codigo is Null)
      
    -- Maneira 2
    Select
      *
    From
      @TabelaA A
    Where
       (not Exists(Select
                     *
                   From
                     @TabelaB B
                   Where
                     (B.Codigo = A.Codigo) and
                     (B.Situacao = 'Fechado')))


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta SSANTOS sexta-feira, 14 de setembro de 2012 13:35
    sexta-feira, 14 de setembro de 2012 10:57
    Moderador