3

次のかなり単純なデータベースを想定します。

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 × mCROSS JOINは返されません(このページに記載されているように)。

私の質問は: 上記のクエリの結果はマニュアルと矛盾していませんか? そうでない場合、それJSONB_EACHはどういうわけか特別に扱われているということですか? (それは私が驚くべきことだと思います。)

4

1 に答える 1