Django中SELECT DISTINCT和ORDER BY在MySQL和SQLite中有效,而在PostgreSQL中不起作用

0 投票
2 回答
1213 浏览
提问于 2025-04-16 10:45

我刚从mysql换到postgres(太棒了!),但现在在我的postgres服务器上(只有这台)我遇到了一个错误:

SELECT DISTINCT 和 ORDER BY 的表达式必须出现在选择列表中

其实查询是一样的:

SELECT DISTINCT * FROM table ORDER BY '?'

顺便说一下,这个查询是django自动生成的。有没有办法让django生成正确的sql呢?

补充说明

结果发现,不知道为什么,在我的Postgres 8.4生产服务器上,Django没有报这个错误,而在我的Postgres 9.0开发服务器上却报了。我不知道这是否和Postgres的版本有关,但实际上在两个Postgres上都出错,而在MySQL上却没有。

2 个回答

2

我认为所有符合SQL标准的数据库平台都会抛出类似的错误。

可以这样想。

CREATE TABLE test (
    id INTEGER NOT NULL,
    c CHAR(1) NOT NULL,
    PRIMARY KEY (id, c)
);

INSERT INTO test VALUES 
    (1, 'a'),
    (1, 'z'),
    (2, 'b');

SELECT * FROM test ORDER BY c;

id  c
--  -
1   a
2   b
1   z

现在想想下面这句话的意思。

SELECT DISTINCT id FROM test ORDER BY c;

数据库管理系统应该用'c'的哪个值来决定'id'为1的排序位置呢?如果它选择'a',那么排序就是'1,2'。如果选择'z',那么排序就是'2,1'。

0

正如@Catcall所说,从技术上讲,这个说法在SQL中是非法的,也没有意义。

不过,MySQL和SQLite允许你使用SELECT DISTINCT id FROM test ORDER BY whatever这样的语句,而PostgreSQL则不允许。就是这么简单。

使用这种方法,MySQL和SQLite可能会产生不确定的结果,我不太确定。

不过,如果你是按照'?'来排序,那应该没问题。

撰写回答