Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

manolegal

[Resolvido] Relacionamento entre tabelas

Recommended Posts

Ola amigos do forum. Estou com um problema no relacionamento entre as tabelas do meu bd.

 

Tenho as tabelas:

1 - "pessoas" com os campos: id_pessoa (pk), nome, data_nasc, etc.

2 - "funcionarios" com os campos: id_funcionario (pk), pessoa_id, etc. O campo pessoa_id é chave estrangeira referenciando id_pessoa da tabela pessoas.

3 - "serviços" com os campos: id_servico, data_execucao, servico_executado, beneficiado_id, etc. O campo beneficiado_id é chave estrangeira referenciando id_pessoa da tabela pessoas.

 

O problema esta quando faço uma consulta referenciando o campo id_pessoa, pois este campo e chave estrangeira em duas tabelas. Se os valores dos campos beneficiado_id (tabela servicos) e pessoa_id (tabela funcionarios) sao diferentes, nao retorna nenhuma linha. Se utilizo só uma referencia na consulta, retorna dados.

A consulta:

 

SQL = "SELECT data_execucao, servico_executado, nome
FROM servicos, pessoas, funcionarios
WHERE funcionarios.pessoa_id = pessoas.id_pessoa
AND servicos.beneficiado_id = pessoas.id_pessoa
ORDER BY data_execucao ASC";

 

 

Sei que o problema esta neste duplo relacionamento do campo "id_pessoa", e gostaria de saber como faço para resolver este problema. Veleu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

 

me pareceu meio confusa sua dúvida e explicação. Em teoria, se há serviço, é por que há funcionário, e se há funcionário, é por que há pessoa.

 

Então você poderia buscar todos os dados que você solicita na query, facil facil.

Em sua query de exemplo, você nao solicita nenhum dado de funcionario, sendo assim poderia efetuar o relacionamento de beneficiado_id direto com a tabela pessoas, já que se trata do mesmo codigo, fazendo assim:

 

SELECT s.data_execucao, s.servico_executado, s.nome
FROM servicos s, pessoas p
WHERE s.beneficiado_id=p.id_pessoa ORDER BY s.data_execucao ASC

 

Mas se mesmo assim, quer relacionar funcionario, poderia fazer assim:

SELECT s.data_execucao, s.servico_executado, s.nome
FROM servicos s, functionarios f, pessoas p
WHERE s.beneficiado_id=f.pessoa_id AND f.pessoa_id=p.id_pessoa  ORDER BY s.data_execucao ASC

 

Se não sanar sua dúvida, poste aí com mais clareza o que necessita. ;)

 

Abraço

 

 

Ola amigos do forum. Estou com um problema no relacionamento entre as tabelas do meu bd.

 

Tenho as tabelas:

1 - "pessoas" com os campos: id_pessoa (pk), nome, data_nasc, etc.

2 - "funcionarios" com os campos: id_funcionario (pk), pessoa_id, etc. O campo pessoa_id é chave estrangeira referenciando id_pessoa da tabela pessoas.

3 - "serviços" com os campos: id_servico, data_execucao, servico_executado, beneficiado_id, etc. O campo beneficiado_id é chave estrangeira referenciando id_pessoa da tabela pessoas.

 

O problema esta quando faço uma consulta referenciando o campo id_pessoa, pois este campo e chave estrangeira em duas tabelas. Se os valores dos campos beneficiado_id (tabela servicos) e pessoa_id (tabela funcionarios) sao diferentes, nao retorna nenhuma linha. Se utilizo só uma referencia na consulta, retorna dados.

A consulta:

 

SQL = "SELECT data_execucao, servico_executado, nome
FROM servicos, pessoas, funcionarios
WHERE funcionarios.pessoa_id = pessoas.id_pessoa
AND servicos.beneficiado_id = pessoas.id_pessoa
ORDER BY data_execucao ASC";

 

 

Sei que o problema esta neste duplo relacionamento do campo "id_pessoa", e gostaria de saber como faço para resolver este problema. Veleu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Fernando.

Desde ja obrigado pela ajuda. Vamos lá.

 

Tenho as tabelas:

1 - "pessoas" com os campos: id_pessoa (chave primaria), nome, data_nasc, etc. Nesta tabela sao cadastradas todas as pessoas do sitema, independente se serao incluidas futuramente como funcionarios ou se serao beneficiados de algum serviço.

 

2 - "funcionarios" com os campos: id_funcionario (chave primaria), pessoa_id (chave estrangeira), etc. Todo funcionario, obrigatoriamente deve estar cadastrado na tabela pessoas, sendo que na tabela funcionarios "gravo" o codigo da pessoa (camplo pessoa_id) a que se refere este funcionario.

 

3 - "serviços" com os campos: id_servico (chave primaria), data_execucao, servico_executado, beneficiado_id (chave estrangeira referenciando pessoas.id_pessoa), funcionario_id (chave estrangeira referenciando funcionarios.id_funcionario). Desculpe, realmente näo havia postado o campo funcionario_id.

 

Seguindo sua sugestäo, tentei a seguinte pesquisa:

SELECT s.data_execucao, s.servico_executado, s.nome
FROM servicos s, functionarios f, pessoas p
WHERE s.beneficiado_id=f.pessoa_id AND f.pessoa_id=p.id_pessoa  ORDER BY s.data_execucao ASC

 

Infelizmente nao tive nenhum registro retornado. No meu caso, necessito listar o nome do funcionario e do beneficiado no mesmo relatorio, e ai que esta o problema, pois o campo id_pessoa esta referenciando ao mesmo tempo na mesma consulta 02 (dois) campos (funcionario_id e beneficiado_id) e nao retorna nada. Se utilizo na consulta so 1 (um) dos 02 relacionamentos mostra o nome certo, caso contrario nao. So retorna dados com os 02 relacionamentos na consulta caso seja a mesma pessoa na condicao de funcionario e de beneficiado.

 

SELECT s.data_execucao, s.servico_executado, s.nome
FROM servicos s, functionarios f, pessoas p
WHERE s.beneficiado_id=f.pessoa_id   ORDER BY s.data_execucao ASC

Nesta consulta retorna o nome do beneficiado

 

SELECT s.data_execucao, s.servico_executado, s.nome
FROM servicos s, functionarios f, pessoas p
WHERE  f.pessoa_id=p.id_pessoa  ORDER BY s.data_execucao ASC

Nesta consulta retorna o nome do funcionario

 

SELECT s.data_execucao, s.servico_executado, s.nome
FROM servicos s, functionarios f, pessoas p
WHERE [b]s.beneficiado_id=f.pessoa_id AND f.pessoa_id=p.id_pessoa[/b]  ORDER BY s.data_execucao ASC

Nesta consulta (com os 02 relacionamentos) nao retorna dados.

 

Espero ter conseguido esclarecer.

No aguardo. Valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que basta ligar pessaoas a funcionários e serviços a pessoas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.