Problema básico com SQL(SELECT)

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

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

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;

[quote=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[/quote]

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

[quote=guilherme.dio][quote=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[/quote]

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

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.

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.

Desculpa, não tinha visto as respostas.

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?

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

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

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.

Hahaha. É isso que eu ia sugerir :wink: