Olá pessoal, Tenho uma dúvida e gostava muito que me ajudassem.
Eu Tenho 3 tabelas na Base de dados e desejo mostrar o nome do Cliente, e o nome do Funcionario numa mesma consulta
Eis as tabelas:
Cliente(codigo, codigoPessoa);
Funcionario(codigo, codigoPessoa)
e Pessoa(codigo, nome).
Eu tenho dois registo na tabela pessoa.
Um registo na tabela cliente com o codigoPessoa do primeiro registro da tabela Pessoa
e um registro na tabela Funcionario com o codigoPessoa do segundo registro da tabela Pessoa
Como faço para criar uma instrução Sql para mostrar o nome do Cliente e o nome do Funcionário na mesma consulta.
Se puderem fazer a consulta com Inner JOIN, daria muito jeito.
Qual sua dúvida exatamente? Você já estudou sobre banco de dados relacional e SQL?
Dá uma estudada pelo menos nessa parte: http://www.devmedia.com.br/utilizando-joins-em-sql/1071
A sua consulta ficaria assim:
SELECT Pessoa.* , Cliente.* , Funcionario.*
FROM Pessoa
LEFT JOIN Cliente ON Cliente.codigoPessoa = Pessoa.codigo
LEFT JOIN Funcionario ON Funcionario.codigoPessoa = Pessoa.codigo
Mas, da forma como está nessa consulta acima, você vai ver todos os campos das tabelas envolvidas na consulta, e os campos podem ficar confusos. Eu recomendaria você usar aliases. Ficaria mais ou menos assim:
SELECT Pessoa.codigo as codigoPessoa, – para mostrar o código da pessoa
Pessoa.nome as nomePessoa, – para mostrar o nome da pessoa
Cliente.codigo as codigoCliente, – para mostrar o código do cliente, se for o registro de cliente
Funcionario.codigo as codigoFuncionario – para mostrar o código do funcionário, se for um funcionário
FROM Pessoa
LEFT JOIN Cliente ON Cliente.codigoPessoa = Pessoa.codigo
LEFT JOIN Funcionario ON Funcionario.codigoPessoa = Pessoa.codigo
Nessa consulta acima você tem a lista de pessoas, e vai saber se ele é um cliente quando trouxer o código do cliente, e se for funcionário, se trouxer o código do funcionário.
Bem o codigo Funcionou dadilton, mas o problema é que retornou duas linhas,
A ideia seria retornar uma unica linha, com o nome do cliente e o nome do funcionario. assim seria facil usar esses campos num relatorio(ireport)
eu tenho conhecimento de sql.
O sql abaixo resolve o problema, mostrando na mesma linha, o nome do cliente, e o nome do funcionario
select p.nome as ‘Funcionário’, cl.nome as 'Cliente’
from funcionario f, pessoa p, cliente c, pessoa cl
where f.codigopessoa = p.codigo and c.codigopessoa = cl.codigo;
mas eu gostaria de fazer isso com join
Eu vejo um problema aí.
É que não há relação entre o cliente e o funcionário na base de dados, e da forma como vc fez, se houver mais de um cliente, o banco vai trazer o funcionário repetido para cada cliente. É um problema de modelagem.
Mas é possível trazer o mesmo resultado do select que vc criou com isso:
select func.nome as ‘Funcionário’, cli.nome as 'Cliente’
from Pessoa func
inner join Funcionario on funcionario.codigopessoa = func.codigo
cross join Cliente
inner join Pessoa cli on cli.codigo = cliente.codigopessoa
mas não vejo muita lógica aí. Mas é isso.
Entao eu acho que vou ter que desnormalizar . Tirar todos os camposda tabela pessoa e mandar para a tabela funcionário e cliente.
Acho que é a melhor opcção. O que achas?
Aí seria bom saber a regra de negócio. A modelagem deve seguir a lógica do negócio.
Neste caso, você quer registrar o quê? Os atendimentos que um funcionário faz? Ou as vendas? Ou simplesmente quer definir que um cliente deve estar associado com um funcionário? Depende muito do tipo de informação que você quer gerar.
é para venda. mas ja percebi. E muito obrigado pela ajuda