Я рекомендую создать индекс для вашей таблицы answer
и использовать исходный запрос.
CREATE INDEX answer_question_id_idx ON answer(question_id);
Без этого индекса потребуется выполнить последовательное сканирование всей таблицы, чтобы найти строки ссоответствующий question_id
.Это должно быть сделано для каждого отдельного вопроса.
В качестве альтернативы, рассмотрите возможность использования объединения, поскольку arc предлагает .Я не эксперт в этом вопросе, но я думаю, что Postgres будет использовать хеш-соединение, а не многократное последовательное сканирование, что сделает запрос быстрее.Если вы хотите сохранить формат идентификатора / заголовка / массива, используйте array_agg
:
SELECT question.id, question.title, array_agg(answer.votes)
FROM question
LEFT JOIN answer ON answer.question_id = question.id
GROUP BY question.id, question.title
ORDER BY question.id;
Однако есть предостережение.Если на вопрос нет ответов, вы получите странный результат:
id | title | array_agg
----+-------------------+-----------
1 | How do I do this? | {3,5}
2 | How do I do that? | {NULL}
(2 rows)
Это из-за LEFT JOIN
, который создает значение NULL
, когда нет строк из объединенной таблицы.имеется в наличии.При INNER JOIN
вторая строка вообще не появится.
Вот почему я рекомендую использовать ваш исходный запрос.Выдает ожидаемый результат:
id | title | ?column?
----+-------------------+----------
1 | How do I do this? | {3,5}
2 | How do I do that? | {}