PostgreSQL: объединение трех таблиц, отсортированных по дате

У меня есть 3 разных SQL-запроса из 3 разных несвязанных таблиц (все используют LIMIT и ORDER BY).

Я хотел бы объединить и отсортировать результаты в соответствии с полем "дата" (которое появляется во всех них)

Что такое SQL?

Ответ 1

Лучший способ - создать новую таблицу, содержащую общие поля из трех других таблиц, и добавить индекс в общее поле даты. Исходные три таблицы должны содержать внешний ключ, связанный с общей таблицей. С этой конструкцией запрос становится простым:

SELECT *
FROM common_table
ORDER BY "date" DESC
LIMIT 100

Если вам нужны данные из более конкретных таблиц, вы можете использовать LEFT JOINs, чтобы также выбирать эти данные в одном запросе.

Если вы не можете изменить свой дизайн и производительность, это не проблема, вы можете использовать UNION ALL для объединения результатов из всех трех таблиц перед сортировкой:

SELECT * FROM table1
UNION ALL
SELECT * FROM table2
UNION ALL
SELECT * FROM table3
ORDER BY "date" DESC
LIMIT 100

Обратите внимание, что вышеизложенное будет работать только в том случае, если все таблицы имеют одинаковую структуру. Если у вас есть поля, которые встречаются в одной таблице, но не в других, вы должны опустить их из SELECT или вернуть NULL для этого столбца в других таблицах. Например, если:

  • table1 имеет столбцы a, b, c и date.
  • table2 имеет столбцы b, c и date.
  • table3 имеет столбцы a, c и date.

Затем используйте это:

SELECT a, b, c, "date"
FROM table1
UNION ALL
SELECT NULL AS a, b, c, "date"
FROM table2
UNION ALL
SELECT a, NULL as b, c, "date"
FROM table3
ORDER BY "date" DESC
LIMIT 100

Ответ 2

SELECT.....
 UNION ALL 
SELECT....
 UNION ALL
SELECT ...
 ORDER BY date_field;

Для достижения максимальной производительности применяйте ORDER BY/LIMIT как можно дольше и избегайте его в подзапросах.