2016-06-22 2 views
0

Postgresで、order by節なしで最初のクエリを実行するだけの逆のSQLクエリを実行したいとします。SELECT文の最初の逆順

は、だからあなたのクエリだった場合:

SELECT * FROM users 

その後

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

それはちょうどこのことだろうか?

ORDER BY Desc 
+3

でそれを行う方法のアイデアを与えるかもしれません*最初の注文はないので*;オーダーが定義されていない(ORDER BY句なし) – wildplasser

答えて

3

あなたはあなたが決定論的順序で行になるだろう間違った仮定に構築されています

SELECT * FROM users; 

、あなたが本当に任意で何を得ます。 Postgresは、見た目に合った行を返します。一般に単純なクエリの場合、通常は行が入力された順番である物理ストレージの順に表示されます。しかし、保証はありません。例えば、バックグラウンド・プロセスが行を並べ替えるときなど、2つの呼び出しの間でいつでも変更することができます(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

ウィンドウ関数はSQL標準の一部であり、Postgresで長年サポートされているため、答えはT-SQL固有のものではありません。しかし、Postgresでは 'row_number()over()'を使うことができます。 –