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

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

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
1 curtida

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

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

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!

1 curtida

entendi agora, obrigado