Postgres:两个字段的完全连接(数据差距问题)



我有两个子查询来创建这些表:

 date      | name | data x
-----------+------+-------
2013-07-01 | a    |   2
2013-07-01 | c    |   3
2013-07-01 | d    |   1
 date      | name | data y
-----------+------+-------
2013-07-01 | a    |   13
2013-07-01 | b    |   16
2013-07-01 | d    |   20

我想使用日期和名称作为连接条件进行完全连接。(日期不限于 2013-07-01,因此日期字段和名称字段组合在一起实际上构成了唯一的伪标识符字段。

理想情况下,结果应如下所示:

 date      | name | data x | data y
-----------+------+--------+-------
2013-07-01 | a    |   2    |  13
2013-07-01 | b    |        |  16
2013-07-01 | c    |   3    |    
2013-07-01 | d    |   1    |  20

(最好是我可以为空输入零,但这可以在以后处理。

我使用了类似于下面的查询:

select 
table1.date, table1.name, table1.dataX, table2.dataY
from table1
full join table2 on table1.date=table2.date and table1.name=table2.name

Postgres 只引入了两个表中都存在的字段(因此在本例中只引入了名称为 a 和 c 的行),这确实违背了完全连接的意义。

我尝试了不同的故障排除方法,到目前为止唯一有效的方法是:

select 
table1.date, table2.date, table1.name, table2.name, table1.dataX, table2.dataY
from table1
full join table2 on table1.date=table2.date and table1.name=table2.name

返回:

 date      |date        | name | name | data x | data y
-----------+------------+------+------+--------+-------
2013-07-01 | 2013-07-01 |  a   |   a  |   2    |  13
           | 2013-07-01 |      |   b  |        |  16
2013-07-01 |            |  c   |      |   3    |    
2013-07-01 | 2013-07-01 |  d   |   d  |   1    |  20

当我使用数据时,有一些解决方法可以使其工作,但实际上并不理想。有什么方法可以使查询返回所需的结果?

在这里掉了不少头发。谢谢一堆!

不要使用

WHERE 子句,而是使用JOIN条件。USING条款派上用场:

SELECT the_date, name, t1.data_x, t2.data_y
FROM   tbl1 t1
FULL   JOIN tbl2 t2 USING (the_date, name);

为了证明一个观点,它可以在没有USING的情况下完成:

SELECT COALESCE(t1.the_date, t2.the_date) AS the_date
      ,COALESCE(t1.name, t2.name) AS name
      ,t1.data_x, t2.data_y
FROM   tbl1 t1
FULL   JOIN tbl2 t2 ON t1.the_date = t2.the_date
                   AND t1.name = t2.name

可能对相关查询有用。第一个更优雅,速度稍快,也是标准的SQL。

-> SQLfiddle(演示两者)

相关内容

  • 没有找到相关文章