我有两个创建这些表的子查询:
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
当我使用数据但实际上并不理想时,有一些解决方法可以使这项工作成功。任何使查询返回所需结果的方法?
这里丢了一些头发。谢谢你!
答案 0 :(得分:0)
不要使用WHERE
子句,而应使用JOIN
条件。 USING
clause派上用场:
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(展示两者)