我正在尝试编写一个查询,它通过第一个表的主键执行2个表和组的简单连接,并在第二个表中执行我想要作为对象返回的几个字段的array_agg.数组需要通过json对象中的2个字段的组合进行排序,并且也是未经过计算的.
到目前为止,我已经提出以下建议:
SELECT zoo.id,ARRAY_AGG( disTINCT ROW_TO_JSON(( SELECT x FROM ( SELECT animals.type,animals.name ) x ))::JSONB -- ORDER BY animals.type,animals.name ) FROM zoo JOIN animals ON animals.zooId = zoo.id GROUP BY zoo.id;
这导致每个动物园有一行,其中一个jsonb对象的聚合数组,每个动物一个,唯一.
但是,我似乎无法弄清楚如何通过代码注释掉的部分中的参数对其进行排序.
如果我拿出不同的,我可以ORDER BY原始字段,这很好,但后来我有重复.
解决方法
SELECT zoo.id,array_agg(za.jb) AS animals FROM zoo JOIN ( SELECT disTINCT ON (zooId,"type","name") zooId,json_build_object('animal_type','animal_name',"name")::jsonb AS jb FROM animals ORDER BY zooId,jb->>'animal_type',jb->>'animal_name' -- ORDER BY zooId,"name" is far more efficient ) AS za ON za.zooId = zoo.id GROUP BY zoo.id;
你可以对jsonb对象的元素进行ORDER BY,如上所示,但是(据我所知)你不能在jsonb对象上使用disTINCT.在你的情况下,无论如何这将是相当低效的(首先构建所有jsonb对象,然后丢弃重复项)并且在聚合级别上,使用标准sql几乎是不可能的.但是,通过在构建jsonb对象之前应用disTINCT子句,可以获得相同的结果.
另外,避免使用像“类型”这样的SQL key words和像“名称”这样的标准数据类型作为列名.两者都是非保留关键字,因此您可以在适当的环境中使用它们,但实际上您的命令可能会让人感到困惑.例如,你可以有一个模式,一个表,一个表中的列,以及一个名为“type”的数据类型,然后你可以得到这个:
SELECT type::type FROM type.type WHERE type = something;
虽然Postgresql会慷慨地接受这一点,但它在最好的情况下很容易混淆,并且在各种更复杂的情况下容易出错.通过对任何关键词进行双重引用可以获得很长的路要走,但最好不要将它们作为标识符来避免.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。