Incohérence de requête PostgreSQL
-
03-07-2019 - |
Question
J'essaie d'exécuter cette commande 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)
;
Lorsque je le fais, le message d'erreur suivant s'affiche:
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.
J'ai essayé d'ajouter: ORDER BY (page.page_namespace, pagelinks.pl_namespace) ASC jusqu'à la fin de la requête sans succès.
MISE À JOUR:
J'ai aussi essayé ceci:
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)
;
Mais je reçois toujours la même erreur.
Thx
La solution
Je n'ai vérifié aucune documentation, mais le fait que votre expression GROUP BY
soit entre parenthèses me semble inhabituel. Que se passe-t-il si vous n'utilisez pas de parenthèses ici?
Autres conseils
Je ne suis pas vraiment un expert, mais si je comprends bien ce message, PostgreSQL ™ recommande de ne pas être en mesure de gérer page.page_namespace <=3
ou pagelinks.pl_namespace <=3
. Pour faire une comparaison de ce type, vous devez définir un ordre et peut-être que l'un de ces champs n'est pas un champ numérique standard. Ou peut-être y a-t-il un problème entre nombre entier et virgule flottante - par exemple. la question si " 3.0 = 3 " Ce n’est pas si facile de répondre, car la représentation en virgule flottante de 3.0 n’est probablement pas exactement 3.
Tous des suppositions, mais je suis à peu près sûr que ces deux <=
s sont votre problème.
Eh bien, je ne connais pas le schéma (*) que vous utilisez, mais le message d'erreur semble clair. Une de vos colonnes est de type ENREGISTREMENT et il n'y a pas opérateur pour commander RECORD.Mais certaines parties de votre requête, comme < =, nécessitent un tel opérateur. Il est peu probable que l’utilisation de ORDER BY aide, car le nœud du problème est l’absence d’un opérateur pour commander ...
(*) Parmi vos autres questions, je suppose que votre schéma est un vidage de page Wikipedia dans http://download.wikimedia.org/enwiki/latest/enwiki-latest-page.sql.gz Correct?
j’ai une erreur. mais j'ai trouvé cette page, http://www.w3schools.com/sql/sql_groupby.asp c'est facile, vous devez grouper sans crochets par exemple:
GROUP BY (page.page_namespace, pagelinks.pl_namespace) le correct est GROUP BY page.page_namespace, pagelinks.pl_namespace
salutations !!