#sql #arrays #presto
#sql #массивы #presto
Вопрос:
Я запрашиваю некоторые data (SQL, presto)
, каждый элемент может быть родительским или дочерним для другого. parent IDs
И child IDs
хранятся в строке для этого основного идентификатора в виде массива (bigint). Каждая задача может быть дочерней у нескольких родителей.
Это выглядит примерно так:
id | parent_ids | child_ids
1 | [3] | []
2 | [3] | []
3 | [] | [2,1]
4 | [] | [5]
5 | [4, 6] | []
6 | [] | [5]
Я хочу список всех parent Ids
и каждой из children
в качестве дополнительных строк для этого родителя:
id | child
3 | 1
3 | 2
4 | 5
6 | 5
Есть идеи, как я могу этого добиться?
Ответ №1:
Я думаю, вы хотите:
select p.parent_id as id, t.id as child_id
from t cross join
unnest(t.parent_ids) p(parent_id)
Комментарии:
1. Я думаю, что это сделано! Спасибо! Я думаю, что понимаю, как это работает: unnest parent_ids извлекает каждый родительский идентификатор в списке для каждого идентификатора и создает новую строку, исходный идентификатор строки становится дочерним идентификатором, а неназванный родительский идентификатор для этой строки становится идентификатором. Я вижу, что цель p(parent_id) — (вероятно) присвоить имя неназванному столбцу parent_ids parent_id, но я не понимаю, почему p()? не могли бы вы объяснить, пожалуйста?
2.
p(parent_id)
это просто имя, присвоенное неназванному столбцу.3. Обратите внимание, что если
parent_ids
может бытьNULL
или пустым, и вы все еще хотите сохранить такие строки в выходных данных, вы можете использоватьLEFT JOIN UNNEST(t.parent_ids) p(parent_id) ON true
вместоCROSS JOIN UNNEST(t.parent_ids) p(parent_id)
.4. спасибо — это редактирование помогло мне понять. в этом случае p — это имя таблицы, поэтому можно прочитать его ‘unnest(t.parent_ids) как p (родительский) идентификатор’? ценю помощь!