PostgreSQL inconsistência consulta
-
03-07-2019 - |
Pergunta
Eu estou tentando executar este comando SQL:
SELECT page.page_namespace, pagelinks.pl_namespace, COUNT(*)
FROM page, pagelinks
WHERE
(page.page_namespace <=3 OR page.page_namespace = 12
OR page.page_namespace = 13
)
AND
(pagelinks.pl_namespace <=3 OR pagelinks.pl_namespace = 12
OR pagelinks.pl_namespace = 13
)
AND
(page.page_is_redirect = 0)
AND
pagelinks.pl_from = page.page_id
GROUP BY (page.page_namespace, pagelinks.pl_namespace)
;
Quando eu fizer isso, eu recebo o seguinte erro:
ERROR: could not identify an ordering operator for type record
HINT: Use an explicit ordering operator or modify the query.
********** Error **********
ERROR: could not identify an ordering operator for type record
SQL state: 42883
Hint: Use an explicit ordering operator or modify the query.
Eu tentei adicionar: ORDER BY (page.page_namespace, pagelinks.pl_namespace) ASC para o fim da consulta sem sucesso.
UPDATE:
Eu também tentei isso:
SELECT page.page_namespace, pagelinks.pl_namespace, COUNT(*)
FROM page, pagelinks
WHERE pagelinks.pl_from = page.page_id
GROUP BY (page.page_namespace, pagelinks.pl_namespace)
;
Mas eu ainda obter o mesmo erro.
Thx
Solução
Eu não tenho verificado qualquer documentação, mas o fato de que você tem a sua expressão GROUP BY
entre parênteses parece incomum para mim. O que acontece se você não usar parênteses aqui?
Outras dicas
Eu não sou realmente um especialista, mas o meu entendimento de que a mensagem é que PostgreSQL Compains sobre não ser capaz de lidar com qualquer page.page_namespace <=3
ou pagelinks.pl_namespace <=3
. Para fazer uma comparação como o que você precisa ter uma ordem definida e talvez um desses campos não é um campo numérico padrão. Ou talvez haja algum problema com o ponto inteiro vs. flutuante - por exemplo, a pergunta se "3.0 = 3" não é realmente fácil de responder uma vez que a representação de ponto flutuante de 3,0 é mais provável não exatamente 3.
Todos apenas suposições, mas eu tenho certeza que esses dois <=
s são o seu problema.
Bem, eu não sei o esquema (*) que você usa, mas a mensagem de erro parece claro. Uma de suas colunas é do tipo REGISTRO e não há operador a fim RECORD.But algumas partes de sua consulta como <= requer tal operador de ordenação. Usando ORDER BY é improvável que ajuda uma vez que o cerne do problema é a falta de um operador para a ordem ...
(*) A partir de suas outras perguntas, eu assumo o seu esquema é Wikipedia página despejo em http://download.wikimedia.org/enwiki/latest/enwiki-latest-page.sql.gz correta?
i tem algum erro. mas eu encontrei esta página, http://www.w3schools.com/sql/sql_groupby.asp é fácil, você deve agrupar sem colchetes por exemplo:
GROUP BY (page.page_namespace, pagelinks.pl_namespace) os está correto GROUP BY page.page_namespace, pagelinks.pl_namespace
saudações !!