通过不使用适用于Oracle的PostgreSQL来计算(*)顺序

时间:2017-07-14 06:32:00

标签: sql oracle postgresql

以下是适用于oracle但不适用于PostgreSQL的Sql查询。

select count(*) from users where id>1 order by username;

我知道order by在这个查询中没有任何意义,但仍然是为什么它在oracle上工作。以下是PostgreSQL上的错误

ERROR: column "users.username" must appear in the GROUP BY clause or be used in an aggregate function
Position: 48

SQLState:42803

PostgreSQL版本9.6.3

2 个答案:

答案 0 :(得分:3)

正如Oracle's execution plan所示,在聚合行之后没有排序,这表明Oracle已实现的SQL引擎忽略了该短语。

为什么它不能在PostgreSQL中运行 - 因为运行Postgres的人知道他们正在做什么;)开玩笑,但这个问题对我来说是高度推测的,没有看到Oracle vs MySQL源代码。更大的问题是Oracle和MySQL是否允许巧合,或者因为Oracle拥有这两者。

最后说明: 如果您要问为什么类似的软件应用程序的行为不同,我认为包含您所指的版本也很重要。即使同一应用程序的不同版本也可能遵循不同的指令。

答案 1 :(得分:2)

如果您只查找所有记录的计数,则不需要order by子句,因为它甚至在oracle中也没有意义。在这种情况下,请删除order by

select count(*) from users where id>1

如果您正在寻找用户名智能计数,那么就有用户名排序的含义,在这种情况下,您可以使用以下查询。

select count(*) from users where id>1 group by username order by username;

希望你的怀疑得到澄清。