说我有两张桌子:帖子和嵌入。帖子中的每个帖子都可能有一些与其关联的嵌入,特定顺序必须保留。此查询似乎正常工作,生成如下所示的结果为“Post_embeds”:
SELECT p.id AS pid, array_agg(e.code) AS code
FROM posts p, unnest(p.embeds) embed_id
JOIN embeds e ON e.id = embed_id
GROUP BY p.id;
如您所见,订单嵌入是保留的。但后来我创建了一个视图 post_embeds 并尝试查询此视图:
SELECT * FROM post_embeds WHERE pid=1
嵌入的顺序消失了。我怀疑我的第一个查询并不能保证总是保留顺序,而且只是因为巧合。
如何使用关联的嵌入正确查询某些帖子,保留顺序?
答案 0 :(得分:7)
使用unnest() WITH ORDINALITY
和聚合中的常规:
SELECT p.id AS pid, array_agg(e.code ORDER BY ordinality) AS code
FROM posts p, unnest(p.embeds) WITH ORDINALITY AS u(embed_id, ordinality)
JOIN embeds e ON e.id = embed_id
GROUP BY p.id;
如果指定了WITH ORDINALITY子句,则会在函数结果列中添加bigint类型的附加列。此列对函数结果集的行进行编号,从1开始。