Erro no Banco de Dados Postgres

olá pessoal do GUJ , estou tentando fazer um select so que dá um erro quando eu vou relacionar as tabelas no “where”


select unif_titulo      as "titulo unif",
       muni_titulo      as "municipio titulo",
       leil_codigo      as "leilao codigo",
       leil_nome        as "leilao nome",
       leil_dt_leilao   as "data leilao"
from   fazenda_v1.leilao                  leil,
       fazenda_v1.municipio               muni,
       fazenda_v1.unidade_federacao       unif
where  muni.muni_codigo = leil.leil_codigo
and    unif.unif_sigla  = muni.muni_codigo
and    unif_sigla      <> 'RR'

order by unif_titulo asc

Ai o Postgres dá a seguinte mensagem

ERRO: operador não existe: text = integer
LINE 10: and unif.unif_sigla = muni.muni_codigo
^
HINT: Nenhum operador corresponde com o nome e o(s) tipo(s) de argumento(s) informados. Você precisa adicionar conversões de tipo explícitas.

********** Erro **********

Select com vírgulas? Por que não usar join ou um de seus tipos (inner, left, right)?
Creio que o erro esteja no fato de você determinar aliases para as tabelas, mas só usar os aliases nos campos do where e não no select em si.
Veja que o erro diz que nenhum operador corresponde ao nome e tipo de dado informado, provavelmente seja isto.

bem meu professor ensinou que deve usar vírgulas , não sei o que é aliases , outros códigos meu funcionaram dessa mesma estrutura ,
é porque assim o erro diz que o postgres não aceita relacionar atributos com tipo diferentes(text(unif.unif_sigla) e interger(muni.muni_codigo))
ele disse que é pra “Você precisa adicionar conversões de tipo explícitas.”, não sei fazer conversões

Não há erro no uso de vírgulas. O que o drsmachado mencionou é uma outra forma de se construir os selects, mas ambas funcionam.

Aliases são apelidos que você dá para as tabelas quando está construindo o comando. No seu comando por exemplo, “leil” é o alias dado para a “tabela fazenda_v1.leilao” . Aliases são obrigatórios quando você tem no comando mais de uma tabela e com campos de mesmo nome. Sem especificar exatamente de qual tabela vem o campo que você se referencia o comando falha.

Bem, já entendeu que seu comando está com problemas devido a conversão. Pesquise na documentação do Postgre sobre CAST. Se quisesse converter um campo para integer seria algo assim:

Mas essa conversão ainda pode falhar se em seu campo houver caracteres alfa, por exemplo. Neste caso, se está comparando um campo integer com outro char ou varchar, é mais seguro converter o integer para o tipo char ou varchar se for o caso.

[quote=Super Fabio]bem meu professor ensinou que deve usar vírgulas , não sei o que é aliases , outros códigos meu funcionaram dessa mesma estrutura ,
é porque assim o erro diz que o postgres não aceita relacionar atributos com tipo diferentes(text(unif.unif_sigla) e interger(muni.muni_codigo))
ele disse que é pra “Você precisa adicionar conversões de tipo explícitas.”, não sei fazer conversões[/quote]

O erro decorre de uma falha anterior, no momento de criar as tabelas.
Se você está referenciando um campo numérico em uma tabela e ele deve agir como FK em outra, ambos devem possuir mesmo tipo.
Isso, por si só, garantiria que não haveria tal erro.

O problema em se usar esta abordagem, com vírgulas, é que acaba-se acostumando e não aprende joins (ou tem-se uma maior dificuldade). Posso falar isso com propriedade, pois, eu passei por isto.
Enfim, você deve estar aprendendo isso agora, porém, assim que terminar esse nível de estudo, esqueça o uso de vírgulas. É mais performático usar joins e agregados, pois a forma de consulta é diferente.
Claro que, neste tipo de consulta você não percebe o impacto, por ser muito pequena.

O problema em se usar esta abordagem, com vírgulas, é que acaba-se acostumando e não aprende joins (ou tem-se uma maior dificuldade). Posso falar isso com propriedade, pois, eu passei por isto.
Enfim, você deve estar aprendendo isso agora, porém, assim que terminar esse nível de estudo, esqueça o uso de vírgulas. É mais performático usar joins e agregados, pois a forma de consulta é diferente.
Claro que, neste tipo de consulta você não percebe o impacto, por ser muito pequena.[/quote]

Olha, sinceramente não acho que o uso de vírgula para fazer joins de tabela seja ruim. Eu já programei desta forma e, como você, hoje prefiro usar os joins, pois acho que o código fica mais legível e fácil de localizar as fk’s. Mas muitos colegas preferem usar a vírgula e eu não acho que a diferença de performace justifique a “obrigação” dos programadores abandonarem este tipo de consulta.

o que ambos disseram está certo, num join desses não deveria ser necessário fazer uma conversão, e deveria ter uma chave estrangeira nos campos do relacionamento.

Mais especificamente, o erro parece estar aqui:
ERRO: operador não existe: text = integer
LINE 10: and unif.unif_sigla = muni.muni_codigo

Não entendo porque quer comparar o código do município com a sigla do estado… Possivelmente o código do município, sendo numérico, é o id do município na tabela ou o código dele em alguma outra base de dados (como a do IBGE por exemplo), porque vc quer comparar isso?

Provavelmente a sua regra de joins está errada, acho que deveria ser algo assim:

where  muni.muni_codigo = leil.leil_municipio -- ou leil.muni_codigo
and    unif.unif_sigla  = muni.unif_sigla -- ou juntar pelo id do estado
and    unif_sigla      <> 'RR'  

Sobre “não aprender” join por usar join implícito não acho verdade, a lógica é a mesma, a diferença é que visualmente o join explícito fica mais lógico, mais fácil de dar manutenção e de entender olhando.

Sobre a necessidade dos aliases, não é verdade, você pode muito bem fazer uma consulta sem aliases, referenciando diretamente a tabela para chamar os campos, algo assim:

select unif_titulo as "titulo unif", muni_titulo as "municipio titulo", leil_codigo as "leilao codigo", leil_nome as "leilao nome", leil_dt_leilao as "data leilao" from fazenda_v1.leilao, fazenda_v1.municipio, fazenda_v1.unidade_federacao where fazenda_v1.municipio.muni_codigo = fazenda_v1.leilao.leil_codigo and fazenda_v1.unidade_federacao.unif_sigla = fazenda_v1.municipio.muni_codigo and unif_sigla <> 'RR' order by unif_titulo asc

Mas você só pode fazer isso se não tiver usando a mesma tabela mais de uma vez numa consulta.

Obs: se os nomes das tabelas não forem repetidos, no “where” da consulta que eu coloquei os nomes delas “altamente qualificados”, pode-se remover os nomes dos schemas.

[quote]
Sobre a necessidade dos aliases, não é verdade, você pode muito bem fazer uma consulta sem aliases, referenciando diretamente a tabela para chamar os campos, algo assim:[/quote]

Me expressei mal porque falei apenas de uma forma de se fazer a coisa.