Ir para conteúdo

POWERED BY:

Arquivado

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

Claudio Neto

Relacionamento de três tabelas

Recommended Posts

Tenho três tabelas relacionadas:

 

empresa

contato

obs

 

Na empresa estão cadastrados os dados da empresa belezinha.

Na contato, estão os cadastros dos contatos da empresas, então cada empresa pode ter vários contatos.

E na obs estão as observações feitos para cada contato, sendo que cada contato pode ter várias observações.

 

Preciso montar uma consulta onde eu Pegue todos os dados da empresa, apenas o última contato cadastrado e apenas a última observação feita para esse contato.

 

Todas as tabelas tem datas.

 

Tentei a query abaixo, mas mostra tudo, e não é o que quero:

select em.nome_fantasia, em.razao_social, em.endereco, em.cep, em.bairro, em.cidade, em.segmento, obs.obs, obs.status, obs.data, contato.contato, contato.email, contato.telefone 
from empresas as em inner join obs on em.cod = obs.cod_emp inner join contato on contato.cod_emp = em.cod where em.cod_funcionario = '9'
order by em.data_cadastro desc

Tentei também colocando agrupamento em tudo, mas disse que posso agrupar campo do tipo text, e o campo obs.obs é do tipo text:

select em.nome_fantasia, em.razao_social, em.endereco, em.cep, em.bairro, em.cidade, em.segmento, obs.obs, obs.status, obs.data, contato.contato, contato.email, contato.telefone 
from empresas as em inner join obs on em.cod = obs.cod_emp inner join contato on contato.cod_emp = em.cod where em.cod_funcionario = '9'
group by contato.contato, em.nome_fantasia, em.razao_social, em.endereco, em.cep, em.bairro, em.segmento, em.cidade, 
contato.email, contato.telefone, em.data_cadastro, obs.obs, obs.status, obs.data order by em.data_cadastro desc 

Estou usando SQL Server 2000.

 

Alguém tem uma luz pra mim?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só p você ter uma ideia de uma das opções p/ selecionar o ultimo contato de cada empresa usando subselect:

 

SELECT em.nome_empresa,(SELECT nome FROM contatos WHERE id_empresa=em.id_empresa 
ORDER BY data_cadastro DESC LIMIT 1) AS nome FROM empresa AS em;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, primeiramente obrigado.

 

A idéia quase deu certo, porém, ainda deu o mesmo problema de quando tentei usar group by em tudo.

Ele diz que colunas do tipo text não podem ser agrupadas.

 

A query ficou assim:

select em.nome_fantasia, em.razao_social, em.endereco, em.cep, em.bairro, em.cidade, em.segmento, 
(select top 1 contato.contato from contato where contato.cod_emp = em.cod order by cod desc) as contato, 
(select top 1 contato.email from contato where contato.cod_emp = em.cod order by cod desc) as email, 
(select top 1 contato.telefone from contato where contato.cod_emp = em.cod order by cod desc) as telefone ,
(select obs from obs where obs.cod_funcionario = contato.cod)
from empresas as em, contato where em.cod_funcionario = '9'

E o erro foi:

Server: Msg 279, Level 16, State 3, Line 1
The text, ntext, and image data types are invalid in this subquery or aggregate expression.

Compartilhar este post


Link para o post
Compartilhar em outros sites
obs.obs deve ser de tipo incompatível com este tipo de construção, um palpite pois não conheço SqlServer a fundo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, é o tipo text. Não teria nada que poderia fazer por conta disso?

 

Digo que já melhorou muito. Apesar de agora ainda exibir mais de uma obs caso existam para um mesmo contato, já exibe um único contato por empresa, o último cadastrado e isso já ajuda.

 

Se não tiver jeito por conta do campo ser text deixarei assim mesmo. Alguém sabe de alguma outra forma?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Claudio, campos dos tipos text, ntext, e image dao invalidos para subselects. uma ideia seria dar um convert para varchar(max)

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

qdo se poe varchar ou nvarchar(max) ele vai ateh 8000 caracteres... se o texto tiver mais dados, ele vai cortar, ctza, mas dai, pra se agrupar ou comparar este tipo de dados? Se for necessario tem que dar uma olhada na modelagem....

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.