Получение иностранных ключей в виде отдельных столбцов - PullRequest
0 голосов
/ 06 декабря 2018

Я не очень большой эксперт, когда дело доходит до баз данных, и мне было интересно, возможно ли сделать что-то, что может быть немного странным

У меня есть простая таблица, которая называется options, которая имеет3 столбца: id (PK), user_id (FK), опция

Таблица выглядит следующим образом:

enter image description here

Возможнонаписать запрос, который разбивает столбец опций на несколько столбцов для каждого user_id? Например, глядя на фотографию, это будет примерно так:

user_id  |   option1  | option2  | option3  
1                5         4           2
2                7         2

Мне нужно получить такие данные, потому что это будетПроще экспортировать его в текстовый файл, используя java

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Это не ответ на ваш вопрос, но вам действительно нужны варианты для разных столбцов?Например, вы можете объединить параметры в массиве:

select user_id, array_agg(option)
from options
group by user_id;

или, если обработка массивов с помощью драйвера является проблемой, а параметры действительно целочисленные, а не что-то еще, вы можете объединить их в строку:

select user_id, string_agg(option::text, ',')
from options
group by user_id;
0 голосов
/ 06 декабря 2018

Да, вы можете сделать это с помощью расширения, называемого tablefunc.

Документация https://www.postgresql.org/docs/10/tablefunc.html

Пример

create table test (id int, user_id int, option int);
insert into test values (1,1,5), (2,1,4), (3,1,2,), (4,2,7), (5,2,2);

Перечислите расширения, которые у нас есть:

# \dx
                 List of installed extensions
  Name   | Version |   Schema   |         Description          
---------+---------+------------+------------------------------
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language

Добавить tablefunc расширение

# create extension tablefunc;
CREATE EXTENSION

# \dx
                                 List of installed extensions
   Name    | Version |   Schema   |                        Description                         
-----------+---------+------------+------------------------------------------------------------
 plpgsql   | 1.0     | pg_catalog | PL/pgSQL procedural language
 tablefunc | 1.0     | public     | functions that manipulate whole tables, including crosstab

Отлично, теперь расширение доступно.Давайте напишем запрос

Запрос

select *
from crosstab('select user_id, id, option from test order by 1, 2')
          as (user_id int, option1 int, option2 int, option3 int);

Результат

 user_id | option1 | option2 | option3 
---------+---------+---------+---------
       1 |       5 |       4 |       2
       2 |       7 |       2 |        

Надеюсь, это поможет.

Ограничение

Ограничение заключается в том, что он не создает столбцы автоматически.Однако вы можете написать хранимую функцию, которая считывает максимальное количество столбцов для генерации, динамически создает запрос и выполняет его.

...