2016-10-20 14 views
0

Postgresの使用9.4タイムスタンプによるPostgresソートはMacでは動作しますがLinuxでは動作しません

私はusersテーブルに関連するpostsテーブルを持っています。 2人のユーザーと3人の最新の投稿を照会しています。

SELECT 
    "users"."id" AS "id", 
    "posts"."id" AS "posts__id", 
    "posts"."created_at" AS "posts__created_at" 
FROM (
    SELECT * FROM accounts 
    WHERE TRUE 
    ORDER BY "id" ASC 
    LIMIT 2 
) AS "users" 
LEFT JOIN LATERAL (
    SELECT * FROM posts 
    WHERE "users".id = posts.author_id 
    ORDER BY "created_at" DESC, "id" DESC 
    LIMIT 3 
) AS "posts" ON "users".id = "posts".author_id 

Macの場合、注文は予期されたとおりです。

"2016-04-17 18:49:15.942" 
"2016-04-15 03:29:31.212" 
"2016-04-13 15:07:15.119" 

私はtimestamptzある、created_atに降順ます。 Ubuntuのである私のトラヴィスビルド、上で実行した場合しかし、順序は安定であるが、どちらも昇順でも降順....

"2016-04-15 03:29:31.212" 
"2016-04-13 15:07:15.119" 
"2016-04-17 18:49:15.942" 

ノー運と同じLC_COLLATE = en_US.UTF-8を持つデータベースを作成し、ユーザーを作りました。なぜ地球上でトラビスで作業しているのではないのですか?

+0

これは変更なしでPGバージョン9.5で動作します。あるいは、外部クエリに 'ORDER BY'を追加します。私は移植性のために注文句を追加し、ちょうど9.5にアップグレードしました。 –

答えて

1

これを解決するには、上記の既存のステートメントの下にorder byステートメントを追加してください。 すなわち

のpostgres(および他の多くのDBMSの)上の
SELECT 
    "users"."id" AS "id", 
    "posts"."id" AS "posts__id", 
    "posts"."created_at" AS "posts__created_at" 
FROM (
    SELECT * FROM accounts 
    WHERE TRUE 
    ORDER BY "id" ASC 
    LIMIT 2 
) AS "users" 
LEFT JOIN LATERAL (
    SELECT * FROM posts 
    WHERE "users".id = posts.author_id 
    ORDER BY "created_at" DESC, "id" DESC 
    LIMIT 3 
) AS "posts" ON "users".id = "posts".author_id 
order by posts.created_at desc 

出力の順序はORDER BY文なしに保証することはできません。

実際にorder byステートメントを実行している間はサブクエリ内にありますが、外側のクエリでorder byが必要です。

1

アウタークエリを注文する必要がある場合もあります.2つの内部クエリ間のジョインは、順序付けられていても保証されないためです。

SELECT 
    "users"."id" AS "id", 
    "posts"."id" AS "posts__id", 
    "posts"."created_at" AS "posts__created_at" 
FROM (
    SELECT * FROM accounts 
    WHERE TRUE 
    ORDER BY "id" ASC 
    LIMIT 2 
) AS "users" 
LEFT JOIN LATERAL (
    SELECT * FROM posts 
    WHERE "users".id = posts.author_id 
    ORDER BY "created_at" DESC, "id" DESC 
    LIMIT 3 
) AS "posts" ON "users".id = "posts".author_id 
order by "posts"."created_at" DESC 
1

実際のソート順は、最初の表においてidの順序と、それらを接合する前に第1 created_at & idの順序の両方に依存するので。つまり、結合されたテーブルから選択した値を計算するときに、最初のテーブルの順序で予期しない結果が生じる可能性があります。

ソート順を修正するには、関連する列で最終結果セットをソートする必要があります。

関連する問題