ORA-00918: coluna definida de maneira ambígua[SOU INICIANTE]

5 respostas
L

estou tentando mostrar a matricula, o valor total da comissão e o nome do funcionario no banco, mas ta dando esse erro,ja tentei tudo.

select matricula,sum(valor),prenome
from comissao , empregado
group by matricula

5 Respostas

R

Isso acontece porque você possui algum campo com o mesmo nome nas duas tabelas e para resolver você pode “apelidar” as tabelas e “puxar” os campos pelos apelidos…

select b.matricula,sum(a.valor),b.prenome
from comissao as a, empregado as b
group by b.matricula,b.prenome

Se não quiser usar apelidos (alias), você pode usar o nome da tabela, geralmente o sql fica gigante…

select empregado.matricula,sum(comissao.valor),empregado.prenome
from comissao, empregado
group by empregado.matricula,empregado.prenome
L

Boa tarde, funciona dessa forma, porém a comissão que era pra dar o valor total de cada empregado, ficou igual para todos, o meu problema é que quero mostrar a matricula dos funcionários o valor total da comissão de cada funcionário e o nome deles.

obrigado pela ajuda

L

consegui!!! mudei a matricula para a matricula da tabela comissao e mostrou os valores da comissao total de cada empregado

select comissao.matricula,sum(comissao.valor),empregado.prenome
from comissao, empregado
group by comissao.matricula,empregado.prenome

R

Apenas cuidado com esse “consegui” sem entender os fundamentos…

Vamos ao próximo passo, você não usou um critério para comparar as duas tabelas, você citou o campo matricula na comissão, talvez ele seja o “elo” entre elas e do jeito que você fez não significa que a longo prazo algo dê errado na consulta, o ideal seria usar um where…

select comissao.matricula,sum(comissao.valor),empregado.prenome
from comissao, empregado
where comissao.matricula = empregado.marticula
group by comissao.matricula,empregado.prenome

Pegou a lógica da coisa? Não basta apenas juntar as tabelas, isso não define relacionamentos entre elas é preciso “vinculá-las”, aliás o ideal e mais legível na minha opinião seria usar joins…

select comissao.matricula, sum(comissao.valor), empregado.prenome
from comissao
inner join empregado on comissao.matricula = empregado.marticula
group by comissao.matricula,empregado.prenome

Esse on junto ao inner join cria esse vínculo, dessa forma o que não entrar na condição nem será exibido na consulta e você pode usar o where para outros critérios como funcionários que comecem com a letra ‘A’ por exemplo…

select comissao.matricula, sum(comissao.valor), empregado.prenome
from comissao
inner join empregado on comissao.matricula = empregado.marticula
where empregado.nome like 'A%'
group by comissao.matricula,empregado.prenome

Ou empregados acima de 18 anos…

select comissao.matricula, sum(comissao.valor), empregado.prenome
from comissao
inner join empregado on comissao.matricula = empregado.marticula
where empregado.idade > 18
group by comissao.matricula,empregado.prenome

Ou seja, seria um “refinamento” do que o vincúlo pelo join trouxe na consulta…

Vai treinando, é assim que se aprende, bons estudos!

L

entendi agora, obrigado

Criado 12 de setembro de 2017
Ultima resposta 12 de set. de 2017
Respostas 5
Participantes 2