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

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
..

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

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

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

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

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.

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

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…

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?

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