2017-08-08 283 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

所以我沒有意識到我有重複的記錄,因爲連接。有什麼建議麼?再次感謝。 –