Что означает ошибку «[XX000] ОШИБКА: не удалось создать какие-либо 3-сторонние объединения» Postgresql? - PullRequest
1 голос
/ 06 апреля 2019

У меня есть таблица с полем 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 происходит

см. скрипку.

ОчевидноЯ хотел бы иметь возможность раскомментировать два комментарияd разделяет и даже усложняет предложение FROM.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 09 апреля 2019

Эта проблема возникла из-за ошибки , которая исправлена ​​во всех версиях PostgreSQL , выпущенных 9 мая 2019 .

Это означает, что все версии, перечисленные ниже (и, надеюсь, следующие) в порядке:

  • 9.4.22
  • 9.5.17
  • 9.6.13
  • 10,8
  • 11,3
...