如何对 DML 语句的 RETURNING 子句返回的行进行排序?

var*_*mar 7 postgresql timestamp

我正在使用此语句以升序获取按时间戳排序的所有行

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 *;
Run Code Online (Sandbox Code Playgroud)

我得到了这些结果:

"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"
Run Code Online (Sandbox Code Playgroud)

如您所见,它们没有按 排序createdate。有没有办法对子RETURNING句中的行进行排序?

a_h*_*ame 9

您需要对结果应用 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;
Run Code Online (Sandbox Code Playgroud)