Postgresql错误是什么意思“ [XX000]错误:无法建立任何三向联接”?

时间:2019-04-06 14:01:02

标签: arrays postgresql jsonb

我有一个表,其中的JSONB字段包含嵌套数组。 我想将这些嵌套JSON数组中的数据分解为多行,同时保留有关每个值在数组结构中的位置的信息。

我有一些查询可以工作到一定程度的嵌套,但是到了Postgres失败的地步,我无法理解[XX000] ERROR: failed to build any 3-way joins

有人能指出我在做什么错和/或这个错误是什么意思吗?


为方便起见,以下是重现该问题的所有信息:

一个非常简单的表:

CREATE TABLE random_table (
    random_field JSONB
);

一个非常嵌套的JSONB数据:

INSERT INTO public.random_table (random_field) VALUES ('{"bar": [[[1, 2, 3, 4]]], "foo": [[["abc", "def"], ["tuw", "xyz"]]]}');

一个非常复杂的查询:

SELECT *
FROM random_table
    LEFT OUTER JOIN LATERAL (
        SELECT *
        FROM jsonb_array_elements(random_table.random_field -> 'foo')
            WITH ORDINALITY AS foo_level_1(foo_1, foo_1_index)
        LEFT OUTER JOIN LATERAL (
            SELECT *
            FROM jsonb_array_elements(foo_1)
                WITH ORDINALITY AS foo_level_2(foo_2, foo_2_index)
--             LEFT OUTER JOIN LATERAL (
--                 SELECT *
--                 FROM jsonb_array_elements(foo_2)
--                     WITH ORDINALITY AS foo_level_3(foo_3, foo_3_index)
--             ) AS foo_lateral_2 ON TRUE
        ) AS foo_lateral_1 ON TRUE

--         FULL OUTER JOIN jsonb_array_elements(random_table.random_field -> 'bar')
--             WITH ORDINALITY AS bar_level_1(bar_1, bar_1_index) ON FALSE
--         LEFT OUTER JOIN LATERAL (
--             SELECT *
--             FROM jsonb_array_elements(bar_1)
--                 WITH ORDINALITY AS bar_level_2(bar_2, bar_2_index)
--         ) AS bar_lateral_1 ON TRUE
    ) AS pouet ON TRUE;

请注意两个注释部分:

  • 如果第一个或第二个未注释,则查询似乎按预期方式工作(未完成但令人鼓舞)
  • 如果两者都未注释,则会出现[XX000] ERROR: failed to build any 3-way joins

see the fiddle.

很明显,我希望能够取消注释的两个部分,甚至使FROM子句复杂化。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

发生此问题是由于a bug在所有PostgreSQL版本released on 9th May 2019中均已解决。

这意味着下面列出的所有版本(并希望以下版本)都可以:

  • 9.4.22
  • 9.5.17
  • 9.6.13
  • 10.8
  • 11.3