none
LEFT JOIN com OR RRS feed

  • Pergunta

  • Pessoal,

    Estou fazendo um relacionamento entre tabelas, tabela A e tabela B.
    Quando não existe o registro na TABELA B está retornando o valor NULL (dos valores da tabela B) pois estou utilizando o LEFT JOIN.

    Mas eu gostaria de fazer algo assim: Se não existir os valores na TABELA B procurar na TABELA C.

    Sempre haverá os valores na TABELA C.


    Henrique Fávaro Tâmbalo - Se a resposta ajudou, marque como resposta!

    segunda-feira, 5 de março de 2012 18:38

Respostas

  • Bom de qualquer forma.. veja este exemplo abaixo

    CREATE TABLE Teste1
    (cd_cadastro int, nome varchar(20), cd_tipo int)
    go
    CREATE TABLE Teste2
    (cd_tipo int, nome varchar(20))
    go
    CREATE TABLE Teste3
    (cd_tipo int, nome varchar(20))
    go
    INSERT INTO TESTE1
    VALUES (1,'TESTE 1 ', 1)
    INSERT INTO TESTE1
    VALUES (2,'TESTE 2 ', 2)
    
    INSERT INTO TESTE2
    VALUES (1,'TIPO 1')
    
    INSERT INTO TESTE3
    VALUES (1,'TIPO TESTE3 1')
    INSERT INTO TESTE3
    VALUES (2,'TIPO TESTE3 2')


    depois vc faz assim com o select

    SELECT A.CD_CADASTRO, A.NOME, 
    CASE 
       WHEN B.NOME IS NULL THEN C.NOME
       ELSE B.NOME
    END AS NOME_TIPO
      FROM TESTE1 A LEFT OUTER JOIN TESTE2 B ON A.CD_TIPO = B.CD_TIPO
      LEFT OUTER JOIN TESTE3 C ON C.CD_TIPO = A.CD_TIPO

    Se vc não quiser relacionar a tabela, faz assim:

    SELECT A.CD_CADASTRO, A.NOME, 
    CASE 
       WHEN B.NOME IS NULL THEN (select nome from TESTE3 where cd_tipo = A.cd_tipo)
       ELSE B.NOME
    END AS NOME_TIPO
      FROM TESTE1 A LEFT OUTER JOIN TESTE2 B ON A.CD_TIPO = B.CD_TIPO
      

    só cuidado com performance


    Isco Sistemas José Luiz Borges


    • Editado Jose Luiz Borges segunda-feira, 5 de março de 2012 19:15
    • Sugerido como Resposta David Silva terça-feira, 6 de março de 2012 00:33
    • Marcado como Resposta Eder Costa quinta-feira, 8 de março de 2012 13:44
    segunda-feira, 5 de março de 2012 19:13

Todas as Respostas

  • opa

    Mas por que você não relaciona a tabela C no seu select ? 

    o resultado vai trazer em outra coluna, depois vc trata a informação com o case

    ou vai alterar muito a sua programação ?


    Isco Sistemas José Luiz Borges

    segunda-feira, 5 de março de 2012 19:01
  • Bom de qualquer forma.. veja este exemplo abaixo

    CREATE TABLE Teste1
    (cd_cadastro int, nome varchar(20), cd_tipo int)
    go
    CREATE TABLE Teste2
    (cd_tipo int, nome varchar(20))
    go
    CREATE TABLE Teste3
    (cd_tipo int, nome varchar(20))
    go
    INSERT INTO TESTE1
    VALUES (1,'TESTE 1 ', 1)
    INSERT INTO TESTE1
    VALUES (2,'TESTE 2 ', 2)
    
    INSERT INTO TESTE2
    VALUES (1,'TIPO 1')
    
    INSERT INTO TESTE3
    VALUES (1,'TIPO TESTE3 1')
    INSERT INTO TESTE3
    VALUES (2,'TIPO TESTE3 2')


    depois vc faz assim com o select

    SELECT A.CD_CADASTRO, A.NOME, 
    CASE 
       WHEN B.NOME IS NULL THEN C.NOME
       ELSE B.NOME
    END AS NOME_TIPO
      FROM TESTE1 A LEFT OUTER JOIN TESTE2 B ON A.CD_TIPO = B.CD_TIPO
      LEFT OUTER JOIN TESTE3 C ON C.CD_TIPO = A.CD_TIPO

    Se vc não quiser relacionar a tabela, faz assim:

    SELECT A.CD_CADASTRO, A.NOME, 
    CASE 
       WHEN B.NOME IS NULL THEN (select nome from TESTE3 where cd_tipo = A.cd_tipo)
       ELSE B.NOME
    END AS NOME_TIPO
      FROM TESTE1 A LEFT OUTER JOIN TESTE2 B ON A.CD_TIPO = B.CD_TIPO
      

    só cuidado com performance


    Isco Sistemas José Luiz Borges


    • Editado Jose Luiz Borges segunda-feira, 5 de março de 2012 19:15
    • Sugerido como Resposta David Silva terça-feira, 6 de março de 2012 00:33
    • Marcado como Resposta Eder Costa quinta-feira, 8 de março de 2012 13:44
    segunda-feira, 5 de março de 2012 19:13