我有一个名为users的表,它有一个名为'history'的jsonb列。这是一个对象数组,其中一个元素叫做uid,它是访问页面的人的id,如下所示:
[ {"ip":"...","uid":2} , {"ip":"...","uid":4} , ... ]
我正在运行一个查询,将jsonb对象与字段uname
附加在一起,以使理解谁'uid'更容易一些,这将产生:
[ {"ip":"...","uid":2,"uname":"bob"} , {"ip":"...","uid":4,"uname":"dave"} , ... ]
我目前正在使用以下查询(例如,uid=2):
SELECT json_agg(history2||jsonb_build_object('uname',uname::text)) FROM
(SELECT jsonb_array_elements(history) AS history2 FROM users WHERE uid=2) AS table1
LEFT JOIN users AS table2 ON history2->>'uid'=table2.uid
我使用子查询返回json对象表,然后再次连接到用户表以获取用户名。
我的问题是:有没有一种方法可以做到这一点,而不需要子查询?我读到可以使用横向连接,但我所有的尝试似乎都不起作用。
提前感谢。
您可以使用外部连接将jsonb_array_elements
移动到FROM子句中:
SELECT jsonb_agg(h.item||jsonb_build_object('uname', u.uname))
FROM users u
LEFT JOIN jsonb_array_elements(u.history) as h(item) on h.item ->> 'uid' = u.uid::text
WHERE u.uid = 2