SELECT DISTINCT,由Django创建的ORDER BY在MySQL和SQLite中工作,而不是PostgreSQL

时间:2011-01-28 01:23:32

标签: python django postgresql migration

我刚刚从mysql切换到postgres(yay!)但现在在我的postgres服务器上(仅限)我收到的错误是:

SELECT DISTINCT,ORDER BY表达式必须出现在选择列表

这是相同的查询:

SELECT DISTINCT * FROM table ORDER BY '?'

BTW这是由django自动生成的查询。或者,任何方式让django实际呈现正确的sql?

附录

事实证明,无论出于何种原因,使用我的Postgres 8.4生产服务器,Django正在消除错误,而使用我的Postgres 9.0开发服务器却没有。我不知道它是否与Postgres版本有关,但事实上它在Postgreses中都是错误而在MySQL中没有错误

2 个答案:

答案 0 :(得分:2)

我希望所有符合SQL标准的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;

dbms使用哪个'c'值来排序'id'1在排序顺序中?如果选择“a”,则订单为“1,2”。如果它选择'z',则订单为'2,1'。

答案 1 :(得分:0)

作为@Catcall said,从技术上讲,这种说法在SQL中是非法且无意义的。

但是,MySQL和SQLite允许您执行SELECT DISTINCT id FROM test ORDER BY whatever,而PostgreSQL则不允许。{1}}就这么简单。

MySQL和SQLite可能会使用此方法产生非确定性结果,我不确定。

但是,如果您按'?'订购,则应该没问题。