反转SELECT语句的初始顺序

时间:2016-06-22 23:33:23

标签: sql postgresql sql-order-by

我想在Postgres中运行一个SQL查询,它与你在没有order by子句的情况下运行初始查询所获得的完全相反。

因此,如果您的查询是:

SELECT * FROM users 

然后

SELECT * FROM users ORDER BY <something here to make it exactly the reverse of before>

会不就是这样?

ORDER BY Desc

2 个答案:

答案 0 :(得分:5)

您正在构建 错误的假设 ,您将获得确定顺序的行:

SELECT * FROM users;

你得到的是任意的。 Postgres以其认为合适的任何方式返回行。对于简单查询,通常按其物理存储顺序排列,通常是输入行的顺序。但是没有保证,它可能会在两次调用之间的任何时间发生变化,例如当后台进程重新排序行时 - 例如VACUUM。或者更复杂的查询可能会根据索引或连接返回行。简而言之:对于关系数据库中的表行, 没有可靠的订单 ,除非您使用ORDER BY指定它。

也就是说,假设您按照 物理存储 的顺序从上述简单查询中获取行,这将使您获得相反的顺序:

SELECT * FROM users
ORDER  BY ctid DESC;

ctid是表示物理顺序的内部元组ID。相关:

答案 1 :(得分:0)

这是一个tsql解决方案,这可能会让你知道如何在postgres中做到这一点

select * from (
SELECT *, row_number() over( order by (select 1)) rowid 
  FROM users 
  ) x 
  order by rowid desc