Ir para conteúdo

Arquivado

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

wagatim

Consulta com 3 tabelas, quem sabe?

Recommended Posts

Prezados amigos,

 

Preciso fazer uma consulta entre 2 tabelas que possuem uma terceira como ligação mas não estou conseguindo, sera q alguem poderia me ajudar?

Ja vou explicar:

 

Eu tenho 3 tabelas no banco de dados:

- Agenda (codigo,compromisso);

- Clientes (codigo, cliente);

- Vinculos (cod_compromisso, cod_cliente);

 

Suponhamos q eu tenha os seguintes dados gravados:

(Agenda):

1 - Reunião com Diretor;

2 - Audiencia publica;

3 - Curso de Vendas;

4 - Treinamento;

 

(Clientes):

1 - Pedro;

2 - Paulo;

3 - Claudio;

4 - Ricardo;

 

(Vinculos):

1 - 1

1 - 2

3 - 1

3 - 2

3 - 3

4 - 1

 

POR EXEMPLO: Eu gostaria de dar um SELECT pra me mostrar quais são os compromissos na Agenda apenas para o Cliente (1-Pedro)

 

Alguem me ajuda??

OBrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezados amigos,

 

Preciso fazer uma consulta entre 2 tabelas que possuem uma terceira como ligação mas não estou conseguindo, sera q alguem poderia me ajudar?

Ja vou explicar:

 

Eu tenho 3 tabelas no banco de dados:

- Agenda (codigo,compromisso);

- Clientes (codigo, cliente);

- Vinculos (cod_compromisso, cod_cliente);

 

Suponhamos q eu tenha os seguintes dados gravados:

(Agenda):

1 - Reunião com Diretor;

2 - Audiencia publica;

3 - Curso de Vendas;

4 - Treinamento;

 

(Clientes):

1 - Pedro;

2 - Paulo;

3 - Claudio;

4 - Ricardo;

 

(Vinculos):

1 - 1

1 - 2

3 - 1

3 - 2

3 - 3

4 - 1

 

POR EXEMPLO: Eu gostaria de dar um SELECT pra me mostrar quais são os compromissos na Agenda apenas para o Cliente (1-Pedro)

 

Alguem me ajuda??

OBrigado

 

 

Leia sintaxe sql Dica: SELECT INNER JOIN

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exemplo de consulta utilizando 4 tabelas:

 

Tabela Funcionario (1, 1) x (1, *)Cidade, e Cidade (1, 1) x (1, *)UF

Tabela Funcionario (1, 1) x (1, *)Setor

 

SELECT FUNCIONARIO.NOME, SETOR.NOME, CIDADE.NOME, UF.NOME
FROM FUNCIONARIO INNER JOIN SETOR
ON FUNCIONARIO.IDSETOR = SETOR.IDSETOR
INNER JOIN CIDADE
ON FUNCIONARIO.IDCIDADE = CIDADE.IDCIDADE
INNER JOIN UF
ON CIDADE.UF = UF.UF;

Compartilhar este post


Link para o post
Compartilhar em outros sites

- Agenda (codigo,compromisso);

- Clientes (codigo, cliente);

- Vinculos (cod_compromisso, cod_cliente);

 

 

sql básico

 

 

SELECT *

FROM AGENDA,CLEINTES,VINCULOS

WHERE AGENDA.CODIGO = CLIENTES.CODIGO

AND CLIENTES.CLIENTE = VINCULOS.COD_CLIENTE

AND CLIENTES.CLIENTE = 1

 

o resto quase sempre é variação em cima disto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só lembrando que a consulta do MOtta é a melhor a ser feita, porque se você usar inner join em várias tabelas, muito provavelmente você terá resultados duplicado, e ai pra ajeitar é necessário um bom conhecimento em sql, pois você tera que usar group by, e as vezes nem com group by da pra sair. A melhor sugestão é você seprar em várias consultas, caso não consiga fazer com uma só.

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só lembrando que a consulta do MOtta é a melhor a ser feita, porque se você usar inner join em várias tabelas, muito provavelmente você terá resultados duplicado, e ai pra ajeitar é necessário um bom conhecimento em sql, pois você tera que usar group by, e as vezes nem com group by da pra sair. A melhor sugestão é você seprar em várias consultas, caso não consiga fazer com uma só.

 

Abs

 

 

 

 

POR EXEMPLO: Eu gostaria de dar um SELECT pra me mostrar quais são os compromissos na Agenda apenas para o Cliente (1-Pedro)

 

 

A sugestão para usar o INNER JOIN economiza comandos quando a consulta utiliza muitas tabelas, mas também pode ser feita com WHERE.

 

O colega solicitou a consulta referente a 1 usuário.

 

Quando for uma lista usa-se GROUP BY, para não duplicar registros basta adicionar

 

HAVING COUNT (nome_do_campo) = 1;

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

- Agenda (codigo,compromisso);

- Clientes (codigo, cliente);

- Vinculos (cod_compromisso, cod_cliente);

 

 

sql básico

 

 

SELECT *

FROM AGENDA,CLEINTES,VINCULOS

WHERE AGENDA.CODIGO = CLIENTES.CODIGO

AND CLIENTES.CLIENTE = VINCULOS.COD_CLIENTE

AND CLIENTES.CLIENTE = 1

 

o resto quase sempre é variação em cima disto

 

 

Motta, após tomar uma surra para abrir meu backup no phpMyAdmim (estou aprendendo), pude testar os comandos para consulta em várias tabelas.

 

Usei o exemplo que mencionei, testei agora com:

 

SELECT * FROM FUNCIONARIO WHERE NOME LIKE 'A%';

No meu caso funcionou beleza, eu tinha apenas 1 funcionário cadastrado com a letra inicial "A".

 

Mas ... não exibiu a UF, sendo que esta tabela (UF) não possui relacionamento direto com Funcionario.

 

Modelagem --> http://img687.imageshack.us/img687/6332/empresar.jpg

 

O que falta para que isso ocorra, será necessário criar um novo relacionamento com a tabela Funcionario?

 

Não quero ser invasiva a necessidade do colega, mas penso que a situação seja semelhante. Antes de adaptar sua sugestão a minha modelagem, gostaria de tirar esta dúvida. Se achar necessário, fique à vontade para desmembrar minha pergunta em um novo tópico.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

SQL é tão somente a boa teoria dos conjuntos.

 

SELECT * FROM CLIENTES

Todos os campos da tabela CLIENTES em qualquer condição.

 

SELECT ID,NOME,DATA_NASC FROM CLIENTES WHERE ID =1234

Cliente 1234 e alguns campos deste

 

Join

Junta-se dua ou mais tabelas , pode ser implícito ou explícito, eu uso sempre o implícito, vício do Oracle

 

SELECT * FROM CLIENTES,UF

Todos os registros de CLIENTES multiplicados (Produto Cartesiano), em geral isto não faz sentido (melhor não entrar em detalhes agora de como isto pode ser usado), para se contornar este problema faz-se uma igualdade.

 

 

SELECT UF.NOME_ESTADO,CLIENTES.NOME

FROM CLIENTES,UF

WHERE CLIENTES.UF = UF.UF

 

 

Este é o às vezes tão temido JOIN, ou seja juntar duas tabelas.

 

Ajudou ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existem outros tipo de de join tb, o left outer join e o right outer join as vezes é util.

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigada Motta.

 

 

Claro que ajudou :D (eu avisei, rsrsrs).

 

Tenho 1 semana de contato básico com a linguagem, nem tudo é visto em aula.

 

Vou tentar fazer funcionar aqui, se necessário abro um novo tópico.

 

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Elektra chuchu só uma dica endereço é multivalorado então no modo mais profissional e a forma normalizada, na terceira forma normal é interessante que se crie uma entidade pro endereço, porque ele pode ter mais de um, assim como o telefone.

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Elektra chuchu só uma dica endereço é multivalorado então no modo mais profissional e a forma normalizada, na terceira forma normal é interessante que se crie uma entidade pro endereço, porque ele pode ter mais de um, assim como o telefone.

 

Abs

 

Tive o cuidado de fazer uma pergunta dentro do contexto solicitado pelo autor do tópico.

 

A modelagem que apresentei foi um exercício com poucas tabelas, escolha intencional do instrutor para mostrar

as formas de consulta, nesse caso foi definido antecipadamente que os campos endereço e telefone seriam simples.

 

Treinar pela 1ª vez comandos de consulta neste outro exercício ia complicar um pouco, não concorda? http://img138.imageshack.us/img138/7682/exerc05.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Motta http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

Penso que compreendi sua dica para ficar atento ao campo CEP.

 

No exemplo inicial que mencionei, mesmo considerando o Endereço como campo simples na entidade Funcionario, você sugere a criação de uma tabela específica, assim como Cidade e UF, certo?

 

Ou seja, alguns funcionários podem morar na mesma rua e ter o mesmo CEP.

 

Mais necessário ainda quando Endereço for uma entidade. Valeu o toque.

 

 

 

Se o exemplo é apenas um exercício para aprendizado, nada de complicar além da medida; mas quando a coisa for realmente funcional, atenção redobrada a 'normalização que a experiência prática comprova' para evitar futuras dores de cabeça. É isso?

 

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O uso de uma tabela de CEP garante a qualidade do endereço, em alguns sistemas um bom cadastro de endereço é vital.

 

O chato é que a ECT não disponiniliza esta base que deveria ser pública.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O uso de uma tabela de CEP garante a qualidade do endereço, em alguns sistemas um bom cadastro de endereço é vital.

 

O chato é que a ECT não disponiniliza esta base que deveria ser pública.

 

 

Nem nos recôncavos da rede tem isso?

 

Nunca procurei, mas vou me informar. Conhecimento nunca é demais.

 

 

(tópico abandonado não é invadido, eu não deixo passar uma oportunidade de aprender) http://forum.imasters.com.br/public/style_emoticons/default/innocent.gif

 

 

Abraços

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.