2009-01-03 18 views
2

Je suis en train d'exécuter cette commande SQL:PostgreSQL incohérence de requête

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) 
; 

Quand je le fais, je reçois l'erreur suivante:

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

+0

Publiez votre schéma et un exemple de fichier de données SQL. Dans le cas contraire, il n'est pas facile de voir ce qui se passe. – bortzmeyer

+0

[3]: http://upload.wikimedia.org/wikipedia/commons/4/41/Mediawiki-database-schema.png –

Répondre

12

Je n'ai vérifié aucune documentation mais le fait que vous ayez votre expression GROUP BY entre parenthèses me semble inhabituel. Que se passe-t-il si vous n'utilisez pas de parenthèses ici?

+0

Je viens de tester et, oui, vous avez raison, les parenthèses produisent ce message d'erreur étrange. – bortzmeyer

0

Je ne suis pas un expert, mais ma compréhension de ce message est que PostgreSQL compains de ne pas être en mesure de traiter soit page.page_namespace <=3 ou pagelinks.pl_namespace <=3. Pour faire une comparaison comme celle-ci, vous devez avoir un ordre défini 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 avec le nombre entier par rapport au nombre à virgule flottante - par ex. la question si "3.0 = 3" n'est pas vraiment facile à répondre puisque la représentation en virgule flottante de 3.0 n'est probablement pas exactement 3.

Tout juste deviner, mais je suis assez sûr que ces deux <= sont votre problème.

+0

comme vous pouvez le voir dans ma mise à jour, ce n'était pas le problème. Thx de toute façon –

0

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 RECORD et il n'y a pas d'opérateur pour commander RECORD. Mais certaines parties de votre requête comme < = nécessitent un tel opérateur de commande. En utilisant ORDER BY est peu susceptible d'aider puisque le noeud du problème est le manque d'un opérateur pour commander ...

(*) À partir de vos autres questions, je suppose que votre schéma est dump de la page Wikipedia http://download.wikimedia.org/enwiki/latest/enwiki-latest-page.sql.gz Corriger?

+0

correct. Mais c'est plus que ce fichier. –

+0

Eh bien, comme je l'ai dit, postez le DDL (demandes CREATE TABLE) et un échantillon du fichier de données. Sinon, c'est trop difficile à déboguer. – bortzmeyer

+0

En fait, aucune des colonnes n'était de type RECORD. qu'est-ce que ça veut dire de toute façon? –

-1

J'ai une erreur. mais je trouve cette page, http://www.w3schools.com/sql/sql_groupby.asp il est facile, vous devez regrouper sans parenthèses par exemple:

GROUP BY (page.page_namespace, pagelinks.pl_namespace) correct est GROUP BY page.page_namespace, pagelinks. pl_namespace

salutations !!

+2

Cela a été effacé il y a deux ans, et c'est toujours vrai. Votre réponse n'ajoute rien. –