PostgreSQL - объединение двух таблиц - PullRequest
1 голос
/ 04 января 2010

У меня есть база данных PostgreSQL с двумя таблицами с именами «пользователь» и «группа».У них разные столбцы, но я хочу присоединиться к ним.

пользователь: идентификатор, имя, фамилия, адрес электронной почты, дата регистрации

группа: идентификатор, имя, имя, созданный

Я могу сделать два отдельных запроса: выбрать * из "пользователя", где ... упорядочить по "registrationdate" asc;выберите * из "группы", где ... упорядочить по "createate" asc;

Можно ли объединить эти два запроса в один и упорядочить все по дате?Различные столбцы могут иметь значение NULL, поскольку они не имеют одинаковых имен столбцов.

Возможно ли это?То, что я хочу сделать, это поиск, в котором пользователь и группы будут отображаться в смешанном порядке по дате.

Спасибо и наилучшими пожеланиями.

Ответы [ 4 ]

2 голосов
/ 04 января 2010

Кажется, все не так, но вы можете попробовать

SELECT u.id, u.firstname || ' ' || u.lastname || ' ' || u.email, u.registrationdate AS DateVal
FROM user u
UNION ALL
SELECT g.id, g.name || ' ' || g.desc, g.createdate
FROM group g
ORDER BY 3
1 голос
/ 04 января 2010

Может быть ВИД ? Что-то похожее на это (я не уверен, если вы должны дать имена всем столбцам):

CREATE VIEW
  myview
AS
  SELECT
    "user" as type,
    t1.id,
    t1.username,
    t1.firstname,
    t1.lastname,
    registrationdate as thedate,
    null,
    null,
    null
  FROM t1
UNION ALL
  SELECT
    "group" as type, 
    null,
    null,
    null,
    null,
    createdate as thedate,
    t2.id,
    t2.name,
    t2.desc
;

А затем выберите:

SELECT * FROM myview ORDER BY thedate ASC;
0 голосов
/ 05 января 2010

Вы делаете это для эффективности? Если это так, подумайте, будут ли два отдельных запроса и проще, и, возможно, быстрее или быстрее, чем заставлять postgres перепрыгивать через обручи. Особенно я видел в своей жизни ровно ноль систем, которые были ограничены способностью клиентов выполнять вычисления. База данных, однако, часто является вашей ахиллесовой пятой.

Кроме того, вы поблагодарите себя позже, если будете избегать имен столбцов и таблиц, которые являются зарезервированными словами postgres (user, desc). Цитировать эти имена в psql - боль.

# create temporary table foo (i int);
# create temporary table bar (j int);
# insert into foo values (1);
# insert into foo values (2);
# insert into foo values (3);
# insert into bar values (3);
# insert into bar values (4);
# insert into bar values (5);
# select * from (select i, null as j from foo union select null, j from bar) baz order by coalesce(i, j);
 i | j
---+---
 1 |
 2 |
 3 |
   | 3
   | 4
   | 5
0 голосов
/ 04 января 2010

Вы можете создать вид, а затем отсортировать по дате.

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