web-dev-qa-db-fra.com

Comment puis-je commander des lignes renvoyées par la clause RETURNING d'une instruction DML?

J'utilise cette instruction pour obtenir toutes les lignes ordonnées par horodatage dans l'ordre croissant

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 *;

Et j'obtiens ces résultats:

"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"

Comme vous pouvez le voir, ils ne sont pas triés par createdate. Existe-t-il un moyen de trier les lignes de la clause RETURNING?

7
varun kumar

Vous devez appliquer un ORDER BY au résultat. Pour ce faire, placez l'instruction DELETE dans une expression de table commune. Ensuite, vous pouvez appliquer un ORDER BY lorsque vous le sélectionnez

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;
9