PostgreSQL: как объединить 3 таблицы, отсортированные по дате - PullRequest
12 голосов
/ 20 ноября 2010

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

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

Что такое SQL для этого?

Ответы [ 2 ]

16 голосов
/ 20 ноября 2010

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

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

Если вам также нужны данные из более конкретных таблиц, вы можете использовать ЛЕВЫЕ СОЕДИНЕНИЯ, чтобы также выбрать эти данные в том же запросе.

Если вы не можете изменить свой дизайн и производительность не является проблемой, вы можете использовать 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
9 голосов
/ 20 ноября 2010
SELECT.....
 UNION ALL 
SELECT....
 UNION ALL
SELECT ...
 ORDER BY date_field;

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

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