如果有两个表如下所述:
表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
答案 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 Demo。 COALESCE
函数将返回第一个非null结果,因此可用于获取同一列中的day
值,然后替换nulls
中的acount
和bcount
列。
答案 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)
如果您使用较短的USING
clause作为JOIN条件(在这种情况下可能),您也不需要coalesce(t1.day, t2.day)
,因为这正是在day
子句中列出后,没有表格资格的USING
解析为什么。
虽然可以跳过表别名的关键字AS
,但是你永远不应该跳过列别名 - 如手册中单独的Omitting the AS
Key Word段所述:
在
FROM
个项目中,标准和PostgreSQL都允许省略AS
在作为未保留关键字的别名之前。但这是不切实际的 输出列名称,因为语法含糊不清。