mbo*_*ork 2 postgresql jsonb lateral-join
假设有以下相当简单的数据库:
CREATE TABLE test_table(
name TEXT,
data JSONB
);
INSERT INTO test_table VALUES ('name1', '{"a": 1, "b": 2}'), ('name2', '{"c": 3, "d": 4, "e": 5}');
Run Code Online (Sandbox Code Playgroud)
所以我们有下表:
# SELECT * FROM test_table ;
name | data
-------+--------------------------
name1 | {"a": 1, "b": 2}
name2 | {"c": 3, "d": 4, "e": 5}
(2 rows)
Run Code Online (Sandbox Code Playgroud)
现在我看到了这样的查询:
# SELECT * FROM test_table CROSS JOIN JSONB_EACH(test_table.data);
Run Code Online (Sandbox Code Playgroud)
返回以下结果:
name | data | key | value
-------+--------------------------+-----+-------
name1 | {"a": 1, "b": 2} | a | 1
name1 | {"a": 1, "b": 2} | b | 2
name2 | {"c": 3, "d": 4, "e": 5} | c | 3
name2 | {"c": 3, "d": 4, "e": 5} | d | 4
name2 | {"c": 3, "d": 4, "e": 5} | e | 5
(5 rows)
Run Code Online (Sandbox Code Playgroud)
我的问题是我不明白这里发生了什么。一方面,这看起来像一个LATERAL连接,因为右侧的
JOIN指的是左侧的,结果是完全合乎逻辑的。另一方面,手册是这样说的:
(没有
LATERAL,每个子项SELECT都是独立评估的,因此不能交叉引用任何其他FROM项目。)
和这个:
列源表必须是
INNER或LEFT连接到LATERAL项目 [...]
(参见此处),当然CROSS JOIN不会返回n × m
行(如本页所述)。
我的问题是:上面查询的结果与手册不矛盾吗?如果不是,这是否意味着JSONB_EACH以某种方式受到特殊对待?(这让我感到惊讶。)
| 归档时间: |
|
| 查看次数: |
223 次 |
| 最近记录: |