Postgres ПРИСОЕДИНЯЙТЕСЬ к unnest

Предположим, у меня есть следующие таблицы:

table: followers_arrays

   id   |  array
--------+---------
    1   | {3,4,5}


table: small_profiles

   id   | username |  pic    
--------+----------+-------
    3   |   aaaa   | abcd
    4   |   bbbb   | abcd
    5   |   cccc   | abcd

Я хочу распечатать followers_array с заполненными данными из small_profiles, используя простые JOIN.

Сначала я использую функцию unnest следующим образом:

SELECT id, unnest(followers_array) AS elem FROM followers_arrays 

И это дает мне правильный результат:

   id   |  elem  
--------+--------
    1   |    3
    1   |    4
    1   |    5

Теперь, насколько я понимаю, мне просто нужно присоединить эти данные к ключу small_profiles ON small_profiles.id следующим образом:

SELECT id, unnest(followers_array) AS elem 
FROM followers_arrays 
JOIN small_profiles ON small_profiles.instagram_id = elem

Однако кажется, что во время JOIN столбец elem еще не создан, потому что я получаю следующую ошибку: ОШИБКА: столбец "elem" не существует

Любые мысли, как мне изменить свой запрос? Спасибо


person Rafal Wiliński    schedule 01.11.2015    source источник
comment
шаг запроса: 1- из ..... 2- где .... 3- сгруппировать по .... 4- выбрать ...... Поэтому, когда вы используете псевдоним 'elem' после того, как выбор не работал в присоединиться   -  person Mustafa ShazLy    schedule 26.04.2018


Ответы (2)


Это плохой дизайн, но вот ваш ответ:

select f.id, f.follower, s.username, s.pic
from
    (
        select id, unnest("array") as follower
        from followers_arrays
    ) f
    inner join
    small_profiles s on f.follower = s.id
person Clodoaldo Neto    schedule 01.11.2015
comment
Работает! Не могли бы вы сказать мне, почему это плохой дизайн? - person Rafal Wiliński; 02.11.2015
comment
@Rafal При этом нет причин иметь массив. Простая нормализация будет работать намного лучше. - person Clodoaldo Neto; 02.11.2015
comment
@ClodoaldoNeto Почему обычная нормализация работает лучше? - person Roshambo; 27.09.2017
comment
Простая нормализация в большинстве случаев будет работать более эффективно, но это не означает, что это плохой дизайн или что для этого нет вариантов использования. - person isapir; 28.12.2017

Я предпочитаю использовать общие табличные выражения, а не подзапросы:

WITH unnested_arr_1 AS (
    SELECT unnest(ARRAY[1, 2, 3]) array_1_item
)
,unnested_arr_2 AS (
    SELECT unnest(ARRAY[2, 3, 4]) array
array_1_item |array_2_item |
-------------|-------------|
1            |[NULL]       |
2            |2            |
3            |3            |
[NULL]       |4            |
item ) SELECT * FROM unnested_arr_1 arr1 FULL OUTER JOIN unnested_arr_2 arr2 ON arr1.array_1_item=arr2.array
array_1_item |array_2_item |
-------------|-------------|
1            |[NULL]       |
2            |2            |
3            |3            |
[NULL]       |4            |
item

производит:

array_1_item |array_2_item |
-------------|-------------|
1            |[NULL]       |
2            |2            |
3            |3            |
[NULL]       |4            |

При объединении только невложенных массивов приведенный выше запрос можно упростить следующим образом:

SELECT * 
FROM   unnest(
    ARRAY[1, 2, 3]
   ,ARRAY[2, 3, 4]
) as U(array_1_item , array_2_item );
person isapir    schedule 28.12.2017
comment
CTE не заменяет подзапрос. При его использовании возникают некоторые проблемы с производительностью — thoughtbot .com/блог/ - person Matzz; 14.12.2020