SELECT Query在PostgreSQL中合并/连接两个表

时间:2013-05-31 15:28:56

标签: sql postgresql full-outer-join

如果有两个表如下所述:

表1

    day          acount
    1998-03-01     8
    1998-03-04     9
    1998-03-05     10
    1998-03-09     8

表2

    day          bcount
    1998-03-02     9
    1998-03-03     7
    1998-03-05     4
    1998-03-06     3

select查询是否可以按以下格式按升序返回数据?

结果

    day          acount        bcount
    1998-03-01     8             0
    1998-03-02     0             9
    1998-03-03     0             7
    1998-03-04     9             0
    1998-03-05     10            4
    1998-03-06     3             0
    1998-03-09     8             0

2 个答案:

答案 0 :(得分:7)

我建议使用FULL OUTER JOIN加入day列上的表格以获得结果:

select coalesce(t1.day, t2.day) "day",
  coalesce(t1.acount, 0) acount,
  coalesce(t2.bcount, 0) bcount
from table1 t1
full outer join table2 t2
  on t1.day = t2.day;

SQL Fiddle with DemoCOALESCE函数将返回第一个非null结果,因此可用于获取同一列中的day值,然后替换nulls中的acountbcount列。

答案 1 :(得分:2)

@bluefeet's query是要走的路。我只是添加一些语法糖和纠正。

SELECT day
     , coalesce(t1.acount, 0) AS acount
     , coalesce(t2.bcount, 0) AS bcount
FROM      table1 t1
FULL JOIN table2 t2 USING (day)

SQL Fiddle.

  • 如果您使用较短的USING clause作为JOIN条件(在这种情况下可能),您也不需要coalesce(t1.day, t2.day),因为这正是day子句中列出后,没有表格资格的USING解析为什么。

  • 虽然可以跳过表别名的关键字AS,但是你永远不应该跳过列别名 - 如手册中单独的Omitting the AS Key Word段所述:

  

FROM个项目中,标准和PostgreSQL都允许省略AS   在作为未保留关键字的别名之前。但这是不切实际的   输出列名称,因为语法含糊不清。