Erro no select.,,,,,,,Column 'id' in where clause is ambiguous!

8 respostas
T

Erro chato,

Pessoal, esta acusando este erro nesta linahd o meu select

Esta linha é para me retornar uma consulta que pegue o registro corrente…

ResultSet rs = stmt.executeQuery("Select e.id_estado, e.unidfed, p.total_final, p.idpar, b.nosso_numero, p.entrega_nro, p.data_inicio, ADDDATE(p.data_inicio,5),c.codigo, p.id,p.id_cliente, c.nome, p.total_com_frete, p.entrega_endereco, p.entrega_cep, p.entrega_cidade, p.entrega_id_estado, p.entrega_id_estado  FROM boletos b, cliente c INNER JOIN pedido p ON p.id_cliente = c.codigo " +
                    "INNER JOIN estado e ON e.id_estado = p.entrega_id_estado WHERE p.id = id ");

parte do strack

..
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'id' in where clause is ambiguous
..

8 Respostas

luistiagos

nesta parte

INNER JOIN estado e ON e.id_estado = p.entrega_id_estado WHERE p.id = id

este = id, é id de que tabela? o interpretador de sql não tem como saber… este id e pertecente a que tabela?
vem da onde? se for de uma tabela coloque: aliasdatabela.id ex: WHERE p.id = x.id assumindo que x é um alias de uma tabela… se é um parametro que o usuario selecionou tire ele da string e concatene-o “WHERE p.id =”+id

T

Oi Luis, obrigada pela resposta

Eu quero pegar este id (que é do registro corrente), pelo menos isso é o que preciso !

O alias da tabela é ´p.´ mas nao fica estranho eu colocar algo como.

WHERE p.id = p.id

luistiagos:
nesta parte

INNER JOIN estado e ON e.id_estado = p.entrega_id_estado WHERE p.id = id

este = id, é id de que tabela? o interpretador de sql não tem como saber… este id e pertecente a que tabela?
vem da onde? se for de uma tabela coloque: aliasdatabela.id ex: WHERE p.id = x.id assumindo que x é um alias de uma tabela… se é um parametro que o usuario selecionou tire ele da string e concatene-o “WHERE p.id =”+id

davidbuzatto

Note que o id depois do p.id está DENTRO do código SQL. Você tem que substituir ele por algum valor certo?

Isso aqui

Ficaria assim:

int idQueVcQuerBuscar = 1; ResultSet rs = stmt.executeQuery("Select e.id_estado, e.unidfed, p.total_final, p.idpar, b.nosso_numero, p.entrega_nro, p.data_inicio, ADDDATE(p.data_inicio,5),c.codigo, p.id,p.id_cliente, c.nome, p.total_com_frete, p.entrega_endereco, p.entrega_cep, p.entrega_cidade, p.entrega_id_estado, p.entrega_id_estado FROM boletos b, cliente c INNER JOIN pedido p ON p.id_cliente = c.codigo INNER JOIN estado e ON e.id_estado = p.entrega_id_estado WHERE p.id = " + idQueVcQuerBuscar );

Claro que a variável “idQueVcQuerBuscar” vai conter o valor do id que vc quer pesquisar… Só coloquei esse nome e essa código p/ vc entender.
Depois de dominar o uso dos Statements, tente usar PreparedStatements, envitando assim SQL Injection.

[]´s

ViniGodoy

Uma dica: É bom você usar quebras de linha no seu SQL. Deixe também o nome das clausulas em maiúsculas.

ResultSet rs = stmt.executeQuery( "SELECT e.id_estado, e.unidfed, p.total_final, p.idpar, b.nosso_numero, p.entrega_nro, p.data_inicio, ADDDATE(p.data_inicio,5),c.codigo, p.id,p.id_cliente, c.nome, p.total_com_frete, p.entrega_endereco, p.entrega_cep, p.entrega_cidade, p.entrega_id_estado, p.entrega_id_estado" + " FROM boletos b, cliente c " + " INNER JOIN pedido p ON p.id_cliente = c.codigo" + " INNER JOIN estado e ON e.id_estado = p.entrega_id_estado WHERE p.id = ?");

Não faz nenhuma diferença para o SQL em si, mas facilita muito a leitura. Código bem-feito é 20% lógica, 80% organização.

davidbuzatto

A dica do Vini é muito válida.
Só uma observação. O “?” (parâmetro) é válido para PreparedStatements e não para Statements simples (que parece que é o que vc está usando pelo nome da sua variável).
Organize o SQL e faça funcionar com o Statement. Depois mude para um PreparedStatement, onde vc pode inserir os parâmetros na query sem fazer essa “sugeira” de ficar colocando os valores a partir da concatenação de Strings.

[]´s

T

Obrigada pela ajuda de voces…

Vou “limpar” este codigo como voces me deram a dica…

Deixei o codigo desta maneira…

...
 "SELECT e.id_estado, e.unidfed, p.total_final, p.idpar, b.nosso_numero, p.entrega_nro, p.data_inicio, ADDDATE(p.data_inicio,5),c.codigo, p.id,p.id_cliente, c.nome, p.total_com_frete, p.entrega_endereco, p.entrega_cep, p.entrega_cidade, p.entrega_id_estado, p.entrega_id_estado" +
    " FROM boletos b, cliente c " +
    " INNER JOIN pedido p ON p.id_cliente = c.codigo" +
    " INNER JOIN estado e ON e.id_estado = p.entrega_id_estado WHERE p.id =" + id);
...

O codigo parou de dar erro, mas ele retorna NULL…(campos vazios)

Seu deixo atribuido um valor a variavel ID(int d…) ele me retorna o registro especifico …ai funciona…

A consulta esta retornando na tela os dados, mas quando peço para mandar para a nota fiscal(boleto)…ele retorna NULL caso eu nao atribua o valor especifico…

davidbuzatto

Vc está mandando o id?
Se não estiver vai dar problema mesmo uai.
O valor do id tem que vir de algum lugar concorda?

marciobarroso

Seria interessante e mais eficaz se você postasse todo o código do método pelo menos. Assim saberíamos se existem as variáveis que esta usando e se não tem mais nada errado. O stacktrace da exceção também deveria ser enviado. Assim conseguiriamos ser mais efetivos na solução do seu problema.

Boa sorte

Criado 18 de junho de 2010
Ultima resposta 18 de jun. de 2010
Respostas 8
Participantes 5