如果我有这样的表达
SELECT t.json_column->>'x',
nested->>'y'
FROM my_table t,
json_array_elements(t->'nested') nested
为什么我不需要加入?更准确地说,为什么这不像笛卡尔CROSS JOIN
?
看起来连接是通过引用表别名隐式发生的t
in the json_array_elements
称呼。但表函数的隐式连接语法对我来说并不熟悉。
PostgreSQL 或其他数据库中是否有类似 SQL 语法的其他示例?
事实上这是老式的CROSS JOIN 的语法。正式等效:
SELECT
t.json_column->>'x',
nested->>'y'
FROM
my_table t
CROSS JOIN
json_array_elements(t.json_column->'nested') nested;
该查询不会产生笛卡尔积,但其作用类似于内部联接。这是因为它有一个hidden连接的两个部分之间的引用,在本例中为别名t
。这种连接称为LATERAL JOIN
. For 文档 http://www.postgresql.org/docs/9.3/static/sql-select.html#SQL-FROM:
当 FROM 项包含 LATERAL 交叉引用时,计算将按如下方式进行:对于提供交叉引用列的 FROM 项的每一行,或提供列的多个 FROM 项的行集,使用以下方法计算 LATERAL 项该行或行集的列值。结果行照常与计算它们的行连接。对列源表中的每一行或一组行重复此操作。
如果连接的一部分是函数,则默认情况下将其视为横向函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)