【问题标题】:PostgreSQL - combining two tablesPostgreSQL - 组合两个表
【发布时间】:2011-01-01 08:32:02
【问题描述】:

我有一个 PostgreSQL 数据库,其中包含两个名为“user”和“group”的表。 他们有不同的专栏,但我想加入他们。

用户:id、名字、姓氏、电子邮件、注册日期

组:id、名称、描述、创建日期

我可以做两个单独的查询: select * from "user" where ... order by "registrationdate" asc; select * from "group" where ... order by "createdate" asc;

是否可以将这两个查询合并为一个并按日期排序? 不同的列可能为 NULL,因为它们没有相同的列名。

这可能吗? 我想做的是搜索用户和组将按日期混合显示。

感谢和最好的问候。

【问题讨论】:

  • 所以您希望结果集包含所有表中的所有列?
  • 您是否希望将registrationdatecreatedate 视为一列进行排序?
  • registrationdate 和 createdate 应该是一栏,是的。
  • "所以您希望结果集包含所有表中的所有列?"是的,因为我认为否则不可能做到?

标签: sql postgresql


【解决方案1】:

这似乎有点不对,但你可以试试

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

【讨论】:

  • 但是在这里你将名字/姓氏/电子邮件放在一个列中,我无法访问这些数据,因为如果有人将“Hans Peter”写为名字,我很难将其分开。跨度>
  • 那么您希望如何UNION 这些表。 您是在寻找加入还是工会
  • 我认为最好的做法是:id|firstname|lastname|email|name|desc 11|---------|--------| -----|test|testDesc 99|TestFirst|TestLast|-----|----|----
  • 您希望显示的内容似乎还不是很清楚。也许如果您从表格中提到的列中告诉我们您希望 show/orderby/select 做什么,我们可以提供帮助。
  • 现在我在做的事情已经很不错了,所以我得好好想想,也得改。也许在程序代码中而不是在 sql 查询中对日期进行排序会更好。非常感谢您的帮助!
【解决方案2】:

也许是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;

【讨论】:

  • 你用视图把事情复杂化了。只需带有 order by 的查询就足够了。
  • 错误:关系 »t1« 不存在
【解决方案3】:

您可以创建视图,然后按日期排序。

【讨论】:

    【解决方案4】:

    您这样做是为了提高效率吗?如果是这样,请考虑两个单独的查询是否会更简单,并且可能与使 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-13
      • 2017-10-31
      • 2020-02-17
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      相关资源
      最近更新 更多