1

如果有如下两个表:

表格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

选择查询可以按以下格式按升序返回数据吗?

结果

    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
4

2 回答 2

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 Demo。该COALESCE函数将返回第一个非空结果,因此可用于获取day同一列中的值,然后替换and列nulls中的值。acountbcount

于 2013-05-31T15:33:12.087 回答
2

@bluefeet 的查询是要走的路。只添加一些语法糖和更正:

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

SQL小提琴。

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

  • 虽然可以跳过表别名的关键字AS,但您永远不应该为列别名跳过它 - 如手册中的单独段落中所述省略AS关键字

FROM项目中,标准和 PostgreSQL 都允许AS在作为非保留关键字的别名之前省略。但这对于输出列名是不切实际的,因为语法不明确。

于 2013-05-31T15:59:16.187 回答