在postgresql上查询json数组时是否应该使用lateral?

wd2eg0qa  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(287)

我有一个与预期一样有效的查询:

SELECT jsonb_array_elements(meta.genres)->>'name' "name", COUNT(id)
FROM movies_metadata meta
GROUP BY "name";

但在这种类型的查询中,似乎每个人都使用侧边。如果我使用横向连接,我可以这样做:

SELECT y.x->>'name' "name", COUNT(id)
FROM movies_metadata meta
LATERAL (SELECT jsonb_array_elements(meta.genres) x) y
GROUP BY y.x;

两个查询产生相同的结果,那么使用第二个查询有什么意义呢?

vfhzx4xs

vfhzx4xs1#

这是一个偏好的问题。
很多postgres用户在使用set返回函数时没有问题 select 条款。显然这是可以接受的语法。这些是sql扩展,因此没有标准指定的“正确”方法。
也就是说,我非常喜欢将集合返回函数放在 from 子句并使用横向联接。我想要那个 from 子句来回答问题:“进入此查询的行的空间是多少?”。我希望“select”子句回答:“返回了哪些列和表达式”。
此外,其他数据库往往要求集合返回函数位于 from 条款。
因此,我发现横向连接更符合sql的精神。但这两种方法都是正确的。

yv5phkfx

yv5phkfx2#

对于这个用例,这两个查询是等价的。第二种形式使用横向连接,比第一种灵活得多。假设您想从嵌套元素中读取更多的键:第一个表单不能这样做,您需要使用第二个表单。

select
    m.id,
    y.x ->> 'name' as name,
    y.x ->> 'key2' as key2,
    y.x ->> 'key3' as key3
from movies_metadata m
cross join lateral jsonb_array_elements(m.genres) as y(x)

请注意,您不需要嵌套 select :如上所示, jsonb_array_elements() 是一个集合返回函数,可以直接放在 from 条款。

相关问题