假设以下,相当简单的数据库:
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}');
所以我们有下表:
# SELECT * FROM test_table ;
name | data
-------+--------------------------
name1 | {"a": 1, "b": 2}
name2 | {"c": 3, "d": 4, "e": 5}
(2 rows)
现在我看到了这样的查询:
# SELECT * FROM test_table CROSS JOIN JSONB_EACH(test_table.data);
返回以下结果:
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)
我的问题是我不明白这里发生了什么。一方面,这看起来像一个LATERAL
连接,因为右侧
JOIN
指的是左侧,结果是完全合乎逻辑的。另一方面,手册是这样说的:
(没有
LATERAL
,每个子项SELECT
都是独立评估的,因此不能交叉引用任何其他FROM
项目。)
还有这个:
列源表必须是
INNER
或LEFT
加入到LATERAL
项目 […]
(见这里),当然CROSS JOIN
不会返回n × m
行(如本页所述)。
我的问题是:上面的查询结果与手册不矛盾吗?如果不是,这是否意味着JSONB_EACH
以某种方式受到特殊对待?(我会感到惊讶。)