次のかなり単純なデータベースを想定します。
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
ます […]
(こちらを参照)、もちろん、n × m
行CROSS JOIN
は返されません(このページに記載されているように)。
私の質問は: 上記のクエリの結果はマニュアルと矛盾していませんか? そうでない場合、それJSONB_EACH
はどういうわけか特別に扱われているということですか? (それは私が驚くべきことだと思います。)