我有一个PostgreSQL数据库,其中有两个名为“user”和“group”的表。 它们有不同的列,但我想加入它们。
用户:id,firstname,lastname,email,registrationdate
group:id,name,desc,createdate
我可以做两个单独的查询: select * from“user”where ... order by“registrationdate”asc; select * from“group”where ... order by“createdate”asc;
是否可以将这两个查询合并为一个并按日期排序? 不同的列可能为NULL,因为它们没有相同的列名。
这可能吗? 我想做的是搜索用户和组将按日期排序显示。
谢谢&最诚挚的问候。
答案 0 :(得分:2)
这似乎有点不对,但你可以试试
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 :(得分:1)
也许是VIEW?类似的东西(我不确定你是否必须给出所有的列名称):
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;
答案 2 :(得分:0)
您可以创建视图,然后按日期排序。
答案 3 :(得分:0)
你这样做是为了提高效率吗?如果是这样,考虑两个单独的查询是否更简单,并且可能比使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