2016-06-22 3 views
0

Я хочу запустить SQL-запрос в Postgres, который в точности обратный тому, который вы получите, просто выполнив начальный запрос без предложения order by.Обратный начальный порядок оператора SELECT

Так что, если ваш запрос был:

SELECT * FROM users 

Тогда

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

Будет ли это быть просто это?

ORDER BY Desc 
+3

Нет, это не так просто, так как нет начального порядка *; order undefined (без предложения ORDER BY) – wildplasser

ответ

3

Вы строите на неправильном предположении, что вы получите строки в неопределенном порядке с:

SELECT * FROM users; 

Что вы получаете действительно произвольно. Postgres возвращает строки так, как считает нужным. Для простых запросов обычно в порядке их физического хранения, который обычно представляет собой порядок ввода строк. Но никаких гарантий нет, и он может меняться в любое время между двумя вызовами, например, когда фоновый процесс переупорядочивает строки - например, VACUUM. Или более сложный запрос может возвращать строки в соответствии с индексом или объединением. Короче говоря: есть нет надежного заказа для строк таблицы в реляционной базе данных, если вы не указали его с ORDER BY.

Тем не менее, если вы получите строки из приведенного выше простого запроса в порядке физической памяти, это заставило бы вас в обратном порядке:

SELECT * FROM users 
ORDER BY ctid DESC; 

ctid является внутренним кортежем ID обозначающих физическим заказ. Связанный:

+2

Как-то странно, что вы выбрали голос, когда вы правы, а? –

+0

@muistooshort: Странно. Я не думаю, что это связано с ответом. –

0

здесь является TSQL решение, thid может дать вам представление о том, как сделать это в Postgres

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

Что такое TSQL для PostgreSQL? –

+2

Ответ на самом деле не является спецификацией T-SQL, поскольку функции окна являются частью стандарта SQL и долгое время поддерживались Postgres. Но вы можете использовать 'row_number() over()' в Postgres. –

Смежные вопросы