select em várias tabelas e mostrar apenas um campo apos comparação

(bitsystems) #1

Pessoal, tenho 3 tabelas: cadcliente, cli_colaborador, cadcolaborador

A cli_colaborador é detalhe da cadcliente, onde são adicionados todos os colaboradores de cada cliente.
Eu preciso fazer um select que me traga a informação de qual cliente o colaborador foi cadastrado, eu fiz assim:

SELECT
cli_colaborador.nomecolab,cadcolaborador.cpf,cli_colaborador.cnpjcli,cadcliente.cnpj,cadcliente.nomefantasia
FROM
cadcliente,
cadcolaborador,
cli_colaborador
WHERE
cli_colaborador.nomecolab = cadcolaborador.cpf and cli_colaborador.cnpjcli = cadcliente.cnpj
order by cadcliente.nomefantasia

no sql builder funcionou perfeitamente me trás o nome do cliente de cada colaborador cadastrado, porém na hora de exibir quero mostrar apenas o nome fantasia, pois ao exibir o campo mostra duplicado, cpf, cnpj e nomefantasia em cada colaborador.

Alguém tem idéia do que posso fazer?

grato,

Tiago Sanches

(Haroldo) #2

Use Inner Join e distinct

(Marco Sabo) #3

Não sei se é correto isto:
WHERE cli_colaborador.nomecolab = cadcolaborador.cpf
Como nomecolab pode ser igual ao cpf?

Para mostrar somente o nome fantasia, no select deixa somente este campo. No where vc faz a amarração para trazer somente o que quer. Estava com um problema deste, não sube fazer o where. Na tabela tinha 100 campos e devido o where estar errado me trazia mais de 200. Veja no sql bilder a qtdde de registro que trás. Se for maior do que está no bd, tá errado.
Dê uma olhada em http://www.luis.blog.br/left-join-e-inner-join-juncao-em-consultas-sql.aspx que explica sobre inner join.

(Diogo Toscano) #4

vc pode alterar para inner join, mas vai dar o mesmo resultado. Os registros estao duplicando devido a duplicar a quantidade de colaboradores.

cliente
1

cliente x colaborador
1 1
1 2
1 3
1 4

entao uma join de cliente com colaborador vai retornar 4 registros(colaboradores diferentes x cliente).
Pode deixar seu sql original e utilizar a quebra no codigo do cliente, exibi os dados do cliente na linha de quebra e o colaborador em baixo.

Ou ja limita no prroprio sql:
SELECT DISTINCT
cli_colaborador.nomecolab,
cadcliente.nomefantasia
FROM
cadcliente,
cadcolaborador,
cli_colaborador
WHERE
cli_colaborador.nomecolab = cadcolaborador.cpf and cli_colaborador.cnpjcli = cadcliente.cnpj
order by cadcliente.nomefantasia

(bitsystems) #5

Eu consegui resolver assim:

SELECT
distinct cli_colaborador.nomecolab,cli_colaborador.cnpjcli,cadcliente.cnpj,cadcliente.nomefantasia
FROM
cadcliente inner join cadcolaborador inner join cli_colaborador
on
‘{cpf}’ = cli_colaborador.nomecolab and cli_colaborador.cnpjcli = cadcliente.cnpj order by cadcliente.nomefantasia

Esse é o resultado por colaborador:

nomecolab cnpjcli cpf cnpj nomefantasia
123456 1234567 123456 1234567 Modas Heap

Porém eu preciso exibir apenas o nome fantasia, vc sabe como faço?

Grato,

Tiago Sanches

(Diogo Toscano) #6

procure no manual pelas macros de esconder campos da grid dinamicamente … ou, se eh é chapado, vai la e tira o campo da grid passando eles pra esuqerda?