none
Como trazer valores de duas tabelas mesmo que a terceira não tenha valores? RRS feed

  • Pergunta

  • Viva pessoal,

    Recentemente o Moderador Roberto F Fonseca auxiliou-me nesta pergunta,

    http://social.msdn.microsoft.com/Forums/pt/520/thread/0dcdaed2-03a8-4dc3-b573-43d59739f918

    Resolvendo o problema com este código

    strSQL = "SELECT * FROM sfid_nif JOIN cliente ON sfid_nif.fidnif=cliente.nif LEFT JOIN contagsm1 ON sfid_nif.fidnif=contagsm1.fidnif WHERE sfid_nif.fidnif=@fidnif AND fidsfid=@fidsfid AND nif=@nif AND contagsm1.fidnif=@fidnif"

    Contudo continuo a ter um problema.

    Estou a selecionar 3 tabelas no botão de pesquisa

    Tabela 1 sfid_nif

    Tabela 2 cliente 

    Tabela 3 contagsm1 

    Nas tabelas sfid_nif e cliente existe sempre valor, pois quando insero um registo ele guarde o nif nas duas tabelas, contudo na tabela 3 (contagsm1) pode não existir valor, porque trata-se de um número de conta do nif.

    O cliente(nif) só tem conta quando é criado uma, contudo o cliente pode já existir na base dados.

    O problema está, ao executar o comando de cima e caso não exista o valor contagsm1.fidnif ele o resultadoé que o cliente não existe, quando na realidade existe, o problema está no fato de o mesmo ainda não ter conta criada e então não existe o nif na tabela de contagsm1.

    Alguém me pode explicar como contornar este problema?

    Obrigado

    quinta-feira, 2 de agosto de 2012 18:45

Respostas

  • Rubem,

    Tente assim

    SELECT * FROM cliente
    LEFT JOIN sfid_nif ON sfid_nif.fidnif=cliente.nif
    LEFT JOIN contagsm1 ON sfid_nif.fidnif=contagsm1.fidnif
    WHERE sfid_nif.fidnif=@fidnif 
    OR fidsfid=@fidsfid 
    OR nif=@nif 
    OR contagsm1.fidnif=@fidnif

    Eu mudei os AND na sua query para OR, veja se isso ajuda a resolver o problema. Analise bem se vc deve utilizar o OR em todos os filtros.


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    • Sugerido como Resposta Roberson Naves sexta-feira, 3 de agosto de 2012 15:32
    • Marcado como Resposta Harley Araujo segunda-feira, 6 de agosto de 2012 13:37
    sexta-feira, 3 de agosto de 2012 14:07
    Moderador

Todas as Respostas

  • Olá Ruben..

    Tente assim... trocando o cliente pelo sfid_nif.

    SELECT * FROM cliente

    LEFT JOIN sfid_nif ON sfid_nif.fidnif=cliente.nif

    LEFT JOIN contagsm1 ON sfid_nif.fidnif=contagsm1.fidnif

    WHERE sfid_nif.fidnif=@fidnif

    AND fidsfid=@fidsfid

    AND nif=@nif

    AND contagsm1.fidnif=@fidnif"

    Espero ter lhe ajudado !


    Não esqueça de marcar o post como útil caso tenha te ajudado.


    • Editado Roberson Naves quinta-feira, 2 de agosto de 2012 19:34
    • Sugerido como Resposta Roberson Naves segunda-feira, 6 de agosto de 2012 13:41
    quinta-feira, 2 de agosto de 2012 19:21
  • Olá Ruben..

    Tente assim... trocando o cliente pelo sfid_nif.

    SELECT * FROM cliente

    LEFT JOIN sfid_nif ON sfid_nif.fidnif=cliente.nif

    LEFT JOIN contagsm1 ON sfid_nif.fidnif=contagsm1.fidnif

    WHERE sfid_nif.fidnif=@fidnif

    AND fidsfid=@fidsfid

    AND nif=@nif

    AND contagsm1.fidnif=@fidnif"

    Espero ter lhe ajudado !


    Não esqueça de marcar o post como útil caso tenha te ajudado.


    Olá Roberson

    Obrigado pela sua ajuda, mas continua a dizer que o cliente não existe, quando na realidade existe. A razão de ele dizer que não existe deve-se ao fato de na tabela contagsm1 não existe o nif pesquisado.

    Creio que se tenha de colocar um case, mas eu não sei mesmo como fazer isso.

    Do tipo case contagsm1.fidnif=contagsm1.fidnif eseculta o select todo como indicas-te, case não exista executa tudo exceto a contagsm1.

    Não sei como se faz isso :(

    quinta-feira, 2 de agosto de 2012 19:56
  • Tentei criar o código:

    strSQL = "SELECT * FROM contagsm1.fidnif, sfid_nif.fidnif, cliente.nif 
    CASE 
    WHEN contagsm1.fidnif > 0 THEN 
    JOIN 
    sfid_nif.fidnif ON contagsm1.fidnif=sfid_nif.fidnif 
    LEFT JOIN cliente.nif ON contagsm1.fidnif=cliente.nif 
    ELSE 
    sfid_nif.fidnif ON cliente.nif=sfid_nif.fidnif 
    END AS contagsm1.fidnif 
    WHERE contagsm1.fidnif=@fidnif AND sfid_nif.fidnif=@fidnif AND fidsfid=@fidsfid "

    O objéctivo é: Caso contagsm1.fidnif tenha valor superior a 0 então trás os valores das tabelas contagsm1.fidnif + sfid_nif.fidnif + cliente.nif

    Caso não encontre trás so os valores das tabelas  sfid_nif.fidnif + cliente.nif

    Não funcionou :( :(

    Alguém ajuda-me?

    quinta-feira, 2 de agosto de 2012 22:51
  • Rubem,

    Tente assim

    SELECT * FROM cliente
    LEFT JOIN sfid_nif ON sfid_nif.fidnif=cliente.nif
    LEFT JOIN contagsm1 ON sfid_nif.fidnif=contagsm1.fidnif
    WHERE sfid_nif.fidnif=@fidnif 
    OR fidsfid=@fidsfid 
    OR nif=@nif 
    OR contagsm1.fidnif=@fidnif

    Eu mudei os AND na sua query para OR, veja se isso ajuda a resolver o problema. Analise bem se vc deve utilizar o OR em todos os filtros.


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    • Sugerido como Resposta Roberson Naves sexta-feira, 3 de agosto de 2012 15:32
    • Marcado como Resposta Harley Araujo segunda-feira, 6 de agosto de 2012 13:37
    sexta-feira, 3 de agosto de 2012 14:07
    Moderador