我有一个与预期一样有效的查询:
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;
两个查询产生相同的结果,那么使用第二个查询有什么意义呢?
2条答案
按热度按时间vfhzx4xs1#
这是一个偏好的问题。
很多postgres用户在使用set返回函数时没有问题
select
条款。显然这是可以接受的语法。这些是sql扩展,因此没有标准指定的“正确”方法。也就是说,我非常喜欢将集合返回函数放在
from
子句并使用横向联接。我想要那个from
子句来回答问题:“进入此查询的行的空间是多少?”。我希望“select”子句回答:“返回了哪些列和表达式”。此外,其他数据库往往要求集合返回函数位于
from
条款。因此,我发现横向连接更符合sql的精神。但这两种方法都是正确的。
yv5phkfx2#
对于这个用例,这两个查询是等价的。第二种形式使用横向连接,比第一种灵活得多。假设您想从嵌套元素中读取更多的键:第一个表单不能这样做,您需要使用第二个表单。
请注意,您不需要嵌套
select
:如上所示,jsonb_array_elements()
是一个集合返回函数,可以直接放在from
条款。