Django中SELECT DISTINCT和ORDER BY在MySQL和SQLite中有效,而在PostgreSQL中不起作用
我刚从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可能会产生不确定的结果,我不太确定。
不过,如果你是按照'?'
来排序,那应该没问题。