web-dev-qa-db-ja.com

DMLステートメントのRETURNING句によって返される行を並べ替えるにはどうすればよいですか?

このステートメントを使用して、すべての行をタイムスタンプで昇順に並べています

DELETE FROM @tableName
        WHERE id = ANY (
            SELECT id
            FROM @tableName
            WHERE source = :p1 AND target = :p2 @readCondition
            ORDER BY createddate
            LIMIT @limit
            FOR UPDATE SKIP LOCKED
        )
        RETURNING *;

そして私はこれらの結果を得ています:

"MessageType":"AssignmentChange.v1","CreatedDate":"2019-12-05T10:55:22.230886"

"MessageType":"AssignmentChange.v1","CreatedDate":"2019-12-05T10:55:22.279604"

"MessageType":"AssignmentChange.v1","CreatedDate":"2019-12-05T10:55:22.276191"
"MessageType":"AssignmentChange.v1","CreatedDate":"2019-12-05T10:55:22.202338"

ご覧のとおり、createdateでソートされていません。 RETURNING句から行を並べ替える方法はありますか?

7
varun kumar

結果にORDER BYを適用する必要があります。そのためには、DELETEステートメントを共通テーブル式に入れます。次に、それから選択するときにORDER BYを適用できます

with deleted as (
  DELETE FROM @tableName
  WHERE id = ANY (
        SELECT id
        FROM @tableName
        WHERE source = :p1 AND target = :p2 @readCondition
        ORDER BY createddate
        LIMIT @limit
        FOR UPDATE SKIP LOCKED)
  RETURNING *
)
select *
from deleted 
order by createddate;