Как отобразить несколько значений в столбце, используя postgres - PullRequest
0 голосов
/ 23 апреля 2020

С учетом следующей структуры таблицы:


table1

first | pkey <- column names
val1  | 1

table2

second | fkey <- column names
val2   | 1
val3   | 1
val4   | 1

Я хотел бы получить вывод, подобный следующему:

first | second <- column names
val1 | val2, val3, val4

Я пробовал:

select table1.first, (select table2.second where table1.pkey=table2.fkey)
from table1 join on table2 where table1.pkey=table2.fkey;

Что-то в этом выглядит неправильно, поэтому я получаю следующее:

more than one row returned by a subquery used as an expression

Я тоже пробовал

select table1.first, (select table2.second where table1.pkey=table2.fkey)
from table1, table2;

Ответы [ 4 ]

3 голосов
/ 23 апреля 2020

Попробуйте следующее, используя string_agg. Вот это DEMO

select
    first,
    string_agg(second, ',') as second
from table1 t1
join table2 t2
on t1.pkey = t2.fkey 
group by
    first

Выход

*----------------------*
| first  second        | 
*----------------------*
| val1  val2,val3,val4 |
*----------------------*
1 голос
/ 23 апреля 2020

Вы почти у цели. В зависимости от результата, который вы хотите получить, есть три варианта:

select
    table1.first,
    (select string_agg(table2.second, ', ') from table2 where table1.pkey=table2.fkey)
from table1;

для получения значения в виде простого текста или

select
    table1.first,
    (select array_agg(table2.second) from table2 where table1.pkey=table2.fkey),
    array(select table2.second from table2 where table1.pkey=table2.fkey)
from table1;

для получения массива значений (в двух синтаксисах c путей) или

select
    table1.first,
    (select json_agg(table2.second) from table2 where table1.pkey=table2.fkey)
from table1;

для получения массива JSON.

Обратите внимание, что я полностью переместил table2 в подзапрос.

1 голос
/ 23 апреля 2020

Я бы рекомендовал агрегировать второй столбец как массив, а не строку:

select t1.first, array_agg(t2.second)
from table1 t1 join
     table2 t2
     on t1.pkey = t2.fkey
group by first
0 голосов
/ 05 мая 2020

Когда я отправил этот вопрос, я помню, что случайно сделал то, что ему задавали некоторое время go. Но я не мог вспомнить как. Оказывается, это может быть более простой способ сделать это.

select table1.first, table2 as second
from table1 join table2 on table1.pkey=table2.fkey;

Похоже, что при выборе таблицы в объединении вся возвращаемая строка таблицы помещается в один столбец с именем таблицы. Затем вы можете использовать as, чтобы присвоить столбцу имя, которое вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...