Problema básico com SQL(SELECT)

11 respostas
guilherme.dio

Bom dia…estou com um problema básico do básico, pois preciso fazer um SELECT entre 3 tabelas, uma é a tabela principal onde possui 2 campos FK, que se conectam com outras 2 tabelas, um de funcionário(cod_funcionário) e outra de cliente(cod_cliente)…

Então preciso fazer um select na tabela principal que me retorne o nome do funcionário e do cliente que estão nas 2 outras tabelas, portanto fiz o seguinte select:

SELECT os.*,funcionario.nome,cliente.nome FROM os,funcionario,cliente WHERE os.cod_funcionario = funcionario.cod_funcionario;

porém, este SELECT me retorna linhas duplicadas, devido ao fato de possuir mais do que 1 registro envolvendo o cod_funcionario na tabela principal, então gostaria de uma breve solução para resolver meu select, e retornar somente um registro de cada, obrigado

Ex: Computador | Vendedora Maria | Cliente José
Computador | Vendedra Maria | Cliente José
Monitor | Vendedor João | Cliente Fernando
Monitor | Vendedor João | Cliente Fernando

11 Respostas

dreampeppers99

Tente essa:

SELECT os.*,func.nome,cli.nome FROM os, funcionario func, cliente cli WHERE os.cod_funcionario = func.cod_funcionario and os.cod_cli = cli.cod_cliente

C

Não entendi muito bem qual é exatamente seu objetivo, mas tente:

select * from os, funcionario, cliente where os.cod_funcionario = funcionario.cod_funcionario and os.cod_cliente = cliente.cod_cliente;

guilherme.dio

dreampeppers99:
Tente essa:

SELECT os.*,func.nome,cli.nome FROM os, funcionario func, cliente cli WHERE os.cod_funcionario = func.cod_funcionario and os.cod_cli = cli.cod_cliente

Por enquanto funciona, será que quando eu possuir muitos registros não vá acabar causando duplicidade novamente?

C

guilherme.dio:
dreampeppers99:
Tente essa:

SELECT os.*,func.nome,cli.nome FROM os, funcionario func, cliente cli WHERE os.cod_funcionario = func.cod_funcionario and os.cod_cli = cli.cod_cliente

Por enquanto funciona, será que quando eu possuir muitos registros não vá acabar causando duplicidade novamente?

Provavelmente não, pois seu erro era o seguinte, você estava retornando registros de 3 tabelas, mas apenas comparando elemento entre duas, então o comportamento da tabela que voce não comparou se comportou de uma maneira inesperada. É muito importante comparar as keys de todas as tabelas envolvidos em um join para que não haja esses tipos de resultado.

Agora, porquê acontece isso quando você não compara, é um pouco difícil de explicar por texto. Tenha certeza de dar uma estudada sobre isso depois.

isaiaspf

Guilherme,

Primeiro, acredito que está faltando uma condição no sua cláusula Where.
Uma solução para garantir que não retorne linhas duplicadas é usar a cláusula Group By. Exemplo:SELECT os.*, funcionario.nome, cliente.nome FROM os, funcionario, cliente WHERE os.cod_funcionario = funcionario.cod_funcionario AND os.cod_cliente = cliente.cod_cliente GROUP BY funcionario.nome, cliente.nome;Neste caso vai agrupar pelo nome do funcionário e nome do cliente.
Abraço.

isaiaspf

Desculpa, não tinha visto as respostas.

guilherme.dio

Realmente…agora funciona corretamente.

Agora estou tendo outro problema, na verdade não é bem problema, é mais falta de conhecimento meu mesmo, porque quando vou fazer o INSERT na tabela OS possuo somente o nome do funcionario e do cliente, porém a tabela de OS precisa do codigo deles…então qual seria a maneira mais viável para proceder sem gambiarras, rsrsrs…

pensei em fazer um SELECT dentro do INSERT, seria o mais viável?

isaiaspf

Na sua tela (view) como você faz pra informar o Funcionário e Cliente?

guilherme.dio

então…tenho o cadastro de venda, nela tem uma ComboBox com os nomes dos funcionários e outra com os clientes…o user faz o cadastro dos dados e e etc…no final escolhe o funcionário e o cliente, então clcia em finalizar, isso dispara o insert, porém no insert eu só possuo a informação dos nomes e não dos codigos devidos…então como faço pra transformar esses nomes em códigos e inserir isto como FK na tabela de vendas.

Quero dispensar minha gambiarra, onde fiz 2 outros métodos, um para pegar o codigo do cliente e outro pra pegar o do funcionario, nao quero isso…quero fazer tudo dentro do insert

guilherme.dio

Já resolvi, nem preciso fazer o select, vou usar o codigo que me retorna no select dos nomes pra carregar as combobox

Obrigado pela ajuda.

isaiaspf

Hahaha. É isso que eu ia sugerir :wink:

Criado 26 de julho de 2011
Ultima resposta 26 de jul. de 2011
Respostas 11
Participantes 4