Incoerenza delle query PostgreSQL
-
03-07-2019 - |
Domanda
Sto cercando di eseguire questo 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 lo faccio, ricevo il seguente errore:
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.
Ho provato ad aggiungere: ORDER BY (page.page_namespace, pagelinks.pl_namespace) ASC alla fine della query senza successo.
UPDATE:
Ho anche provato questo:
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)
;
Ma ho ancora lo stesso errore.
Thx
Soluzione
Non ho controllato alcuna documentazione, ma il fatto che tu abbia la tua espressione GROUP BY
tra parentesi mi sembra insolito. Cosa succede se non usi le parentesi qui?
Altri suggerimenti
Non sono davvero un esperto, ma la mia comprensione di quel messaggio è che PostgreSQL si rammarica di non essere in grado di gestire page.page_namespace <=3
o pagelinks.pl_namespace <=3
. Per fare un confronto del genere è necessario avere un ordine definito e forse uno di questi campi non è un campo numerico standard. O forse c'è qualche problema con numero intero vs. virgola mobile - ad es. la domanda se " 3.0 = 3 " non è così facile rispondere poiché la rappresentazione in virgola mobile di 3.0 probabilmente non è esattamente 3.
Tutto solo congetture, ma sono abbastanza sicuro che quei due <=
siano il tuo problema.
Beh, non conosco lo schema (*) che usi ma il messaggio di errore sembra chiaro. Una delle tue colonne è di tipo RECORD e non esiste operatore per ordinare RECORD. Ma alcune parti della tua query come < = richiedono un tale operatore di ordinazione. È improbabile che utilizzare ORDER BY sia di aiuto poiché il nocciolo del problema è la mancanza di un operatore che ordina ...
(*) Dalle altre tue domande, suppongo che il tuo schema sia il dump della pagina Wikipedia in http://download.wikimedia.org/enwiki/latest/enwiki-latest-page.sql.gz Corretto?
ho qualche errore. ma ho trovato questa pagina, http://www.w3schools.com/sql/sql_groupby.asp è facile, devi raggruppare senza parentesi ad esempio:
GROUP BY (page.page_namespace, pagelinks.pl_namespace) il corretto è GROUP BY page.page_namespace, pagelinks.pl_namespace
saluti !!