FROM子句中的PostgreSQL json_array_elements - 为什么这不是笛卡尔连接?

时间:2015-11-03 22:31:22

标签: json postgresql join

如果我有一个像

这样的表达式
SELECT t.json_column->>'x',
   nested->>'y'
FROM my_table t,
   json_array_elements(t->'nested') nested

为什么我不需要加入?更确切地说,为什么这不像笛卡儿CROSS JOIN

通过在t调用中引用表别名json_array_elements,看起来似乎是隐式绑定。但是我不熟悉带有表函数的隐式连接语法。

PostgreSQL或其他数据库中是否存在类似SQL语法的其他示例?

1 个答案:

答案 0 :(得分:4)

实际上这是CROSS JOIN的老式语法。正式等价物:

$PROJECT_$GITCOMMIT.tar.gz  # WRONG: No variable PROJECT_
${PROJECT}_$GITCOMMIT.tar.gz # CORRECT: test_222.tar.gz

查询不会产生笛卡尔积,但其作用就像内部联接。这是因为它在连接的两个部分之间有一个隐藏引用,在本例中是别名SELECT t.json_column->>'x', nested->>'y' FROM my_table t CROSS JOIN json_array_elements(t.json_column->'nested') nested; 。这种联接称为t。对于the documentation

  

当FROM项包含LATERAL交叉引用时,评估过程如下:对于提供交叉引用列的FROM项的每一行,或提供列的多个FROM项的行集,LATERAL项使用行或行集的列值进行评估。生成的行像往常一样连接它们的行。对列源表中的每一行或每组行重复此操作。

如果连接的某个部分是函数,则默认情况下将其视为横向。