PostgreSQL查询不一致

时间:2009-01-03 22:22:10

标签: sql postgresql rdbms wikipedia

我正在尝试执行此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) 
; 

当我这样做时,我收到以下错误:

    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.

我尝试将 ORDER BY(page.page_namespace,pagelinks.pl_namespace)ASC 添加到查询的末尾,但没有成功。

更新:

我也试过这个:

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

但我仍然得到同样的错误。

THX

4 个答案:

答案 0 :(得分:12)

我没有检查过任何文档,但是在括号中有GROUP BY表达式这一事实对我来说并不常见。如果你不在这里使用括号会怎么样?

答案 1 :(得分:0)

我不是真正的专家,但我对该消息的理解是PostgreSQL无法处理page.page_namespace <=3pagelinks.pl_namespace <=3。要进行比较,您需要定义一个订单,并且这些字段中的一个可能不是标准数字字段。或者整数与浮点有一些问题 - 例如问题是“3.0 = 3”并不是那么容易回答,因为3.0的浮点表示很可能不完全是3。

所有这些只是猜测,但我很确定这两个<=是你的问题。

答案 2 :(得分:0)

好吧,我不知道你使用的架构(*),但错误信息似乎很清楚。您的其中一列属于RECORD类型,并且没有操作员可以订购RECORD。但是您的查询的某些部分(如&lt; =需要这样的排序运算符)。使用ORDER BY不太可能有所帮助,因为问题的关键是缺乏运营商订购......

(*)根据您的其他问题,我假设您的架构是http://download.wikimedia.org/enwiki/latest/enwiki-latest-page.sql.gz中的维基百科页面转储正确吗?

答案 3 :(得分:-1)

我有一些错误。 但我找到了这个页面, http://www.w3schools.com/sql/sql_groupby.asp 这很容易,你必须组成没有括号 例如:

GROUP BY(page.page_namespace,pagelinks.pl_namespace) 正确的是  GROUP BY page.page_namespace,pagelinks.pl_namespace

问候!!