【问题标题】:PostgreSQL json_array_elements in FROM clause - why is this not cartesian join?FROM 子句中的 PostgreSQL json_array_elements - 为什么这不是笛卡尔连接?
【发布时间】:2016-02-04 06:24:41
【问题描述】:

如果我有这样的表达方式

SELECT t.json_column->>'x',
   nested->>'y'
FROM my_table t,
   json_array_elements(t->'nested') nested

为什么我不需要 JOIN?更准确地说,为什么这不像笛卡尔CROSS JOIN

看起来连接是通过在json_array_elements 调用中引用表别名t 隐式发生的。但是表函数的隐式连接语法对我来说并不熟悉。

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

【问题讨论】:

  • 为什么它不像笛卡尔连接?因为,这实际上是一个隐含的LATERALJOIN(如果你使用@ 987654327@子句)

标签: json postgresql join


【解决方案1】:

事实上,这是 CROSS JOIN 的老式语法。正式等效:

SELECT
    t.json_column->>'x',
    nested->>'y'
FROM 
    my_table t
CROSS JOIN
    json_array_elements(t.json_column->'nested') nested;

查询不会产生笛卡尔积,而是像内部连接一样。这是因为它在连接的两个部分之间有一个隐藏引用,在本例中为别名t。这种连接称为LATERAL JOIN。对于the documentation

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

如果连接的一部分是函数,则默认情况下它被视为横向。

【讨论】:

猜你喜欢
  • 2017-07-17
  • 1970-01-01
  • 2012-02-23
  • 2015-11-18
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多