Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres:两个字段完全连接(数据差距问题)_Sql_Postgresql_Join_Null_Full Outer Join - Fatal编程技术网

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

Sql Postgres:两个字段完全连接(数据差距问题),sql,postgresql,join,null,full-outer-join,Sql,Postgresql,Join,Null,Full Outer Join,我有两个子查询创建这些表: 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-

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

 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
我想使用日期和名称作为加入条件进行完全加入。Date不限于2013-07-01,因此Date字段和name字段组合在一起就形成了一个唯一的伪标识符字段

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

 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子句,而是使用连接条件。这本书派上了用场:

SELECT the_date, name, t1.data_x, t2.data_y
FROM   tbl1 t1
FULL   JOIN tbl2 t2 USING (the_date, name);
为了证明这一点,可以不使用:

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


演示这两种功能

对不起,我键入where时是指on。我确实有关节病。事实上,我怀疑是这两个共同的条件导致了这个问题。哪里有打字错误,我道歉。但真正的解决方案是使用date、name来执行完全联接table2,而不是table1.date=table2.date和table1.name=table2.name上的完全联接table2。它帮助带来了所有的数据。另外,在删除两个联接字段(日期和名称)前面的表引用时也会用到。谢谢!谢谢它的底部是为了避免只为date和name字段调用table1或table2,因为缺少值。我说得太早了。
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