Выберите и объедините одинаковые атрибуты из многих таблиц, используя PostgreSQL - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь написать более эффективный PostgreSQL запрос, который объединит подобные атрибуты в многочисленных таблицах. Контекст заключается в том, что в базе данных есть отдельные таблицы результатов для разных оценок, и я пытаюсь посмотреть на результаты по всем оценкам. В настоящий момент, например, у меня есть одна таблица, в которой хранятся имена всех таблиц оценки:

| tables  |
|---------|
| table_a |
| table_b |
| table_c |

И я агрегирую результаты, используя этот запрос (на самом деле, я агрегирую для 25+ разных таблиц):

SELECT person_id, subject_id, outcome
FROM table_a
UNION ALL
SELECT person_id, subject_id, outcome
FROM table_b
UNION ALL
SELECT person_id, subject_id, outcome
FROM table_c

Существует ли PostgreSQL подход к циклическому выполнению одного и того же оператора SELECT по нескольким таблицам, а затем к объединению результатов UNION ALL (например, чтобы мне не пришлось повторять фрагмент выше 25+ раз)?

1 Ответ

0 голосов
/ 07 января 2020

Вы должны написать код, который сгенерирует заявление для вас. Одна вещь, которую вы можете сделать, это написать функцию PL / pg SQL:

CREATE FUNCTION get_them()
RETURNS TABLE (
   person_id bigint,
   subject_id bigint,
   outcome text
) LANGUAGE plpgsql AS
$$DECLARE
   v_sql text := '';
   v_sep text := '';
   v_tab text;
BEGIN
   FOR v_tab IN
      SELECT tables FROM tab_of_tabs
   LOOP
      v_sql := v_sql || v_sep ||
         format(
            'SELECT person_id, subject_id, outcome FROM %I',
            v_tab
         );
      v_sep := ' UNION ALL ';
   END LOOP;

   RETURN QUERY EXECUTE v_sql;
END;$$;
...