2017-08-08 384 views
0

我想让我的查询返回JSON在API中使用。我正在使用PostGIS扩展来处理位置信息。 PostGIS扩展功能运行良好,不存在这个问题。我只提到这一点,因为查询中涉及到PostGIS扩展的功能。我有JSON文件的这些对象:PostgreSQL聚合函数调用不能嵌套使用jsonb_agg函数

  • 主要公司文件(OK)
  • 涉及到相关的活动(*这就是我们有一个问题)
  • 公司(OK)
  • 日期事件
  • 相关公司(OK)
  • 城市相关的公司地址(OK)

这里是我的SQL语句:

SELECT c.id, c.name, c.website, c.longdescription, c.description, c.email, 
jsonb_agg((SELECT ev FROM (SELECT ev.title, ev.description, ev.longdescription, jsonb_agg((SELECT ed FROM(SELECT ed.startdate, ed.enddate, ed.id WHERE ed.id notnull)ed)) AS dates, ev.id WHERE ev.id notnull)ev)) AS events, 
jsonb_agg((SELECT ca FROM (SELECT ct.zip, ca.id, ca.street1, ca.street2, ca.addresstype_id, ST_Y(ca.geopoint::geometry) AS latitude, ST_X(ca.geopoint::geometry) AS longitude WHERE ca.id notnull)ca)) AS addresses 
FROM companies c 
LEFT JOIN events ev ON ev.company_id = c.id 
LEFT JOIN companyaddresses ca ON ca.company_id = c.id 
LEFT JOIN cities ct ON ct.id = ca.city_id 
LEFT JOIN eventdates ed ON ed.event_id = ev.id 
GROUP BY c.id 

任何想法如何我可以改革,因为没有嵌套的功能,仍然得出正确的结果?

回答

1

问题的行是

jsonb_agg((SELECT ev FROM (SELECT ev.title, ev.description, ev.longdescription, jsonb_agg((SELECT ed FROM(SELECT ed.startdate, ed.enddate, ed.id WHERE ed.id notnull)ed)) AS dates, ev.id WHERE ev.id notnull)ev)) AS events, 

我认为它会工作,如果移动jsonb_agg进入第二子查询。因此,改变

jsonb_agg((SELECT ed FROM(SELECT ed.startdate, ed.enddate, ed.id WHERE ed.id notnull)ed)) AS dates 

(SELECT jsonb_agg(ed) FROM(SELECT ed.startdate, ed.enddate, ed.id WHERE ed.id notnull)ed) AS dates 

我不知道这会工作,但如果你提供CREATE语句的edev表,我可以完善它。

+0

它工作。这真棒 - 谢谢你! –

+0

所以我没有意识到我有重复的记录,因为连接。有什么建议么?再次感谢。 –