У меня есть таблица с полем 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.
Любая помощь будет принята с благодарностью.