Usuário com melhor resposta
Como trazer valores de duas tabelas mesmo que a terceira não tenha valores?

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
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
Todas as Respostas
-
Olá Ruben..
Tente assim... trocando o cliente pelo sfid_nif.
Espero ter lhe ajudado !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"
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
-
Olá Ruben..
Tente assim... trocando o cliente pelo sfid_nif.
Espero ter lhe ajudado !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"
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 :(
-
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?
-
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