Разделить массив (bigint) на несколько строк bigint

#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 (родительский) идентификатор’? ценю помощь!