如果我有一个像
这样的表达式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语法的其他示例?
答案 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项使用行或行集的列值进行评估。生成的行像往常一样连接它们的行。对列源表中的每一行或每组行重复此操作。
如果连接的某个部分是函数,则默认情况下将其视为横向。