【问题标题】:SQL join two different tables on timestampSQL在时间戳上连接两个不同的表
【发布时间】:2021-03-31 08:22:34
【问题描述】:

请原谅格式不好,我会尽量保持清楚:

表 A

 |---------------------|------------------|--------------|
 |      col1           |     col2         |   datetime   |
 |---------------------|------------------|--------------|

表 B

 |---------------------|------------------|--------------|
 |      col3           |     col4         |   datetime   |
 |---------------------|------------------|--------------|

我正在寻找的输出是这样的

 |---------------------|------------------|--------------|-----------|---------------|
 |      col1           |     col2         |   col3       |   col4    |   datetime    |             
 |---------------------|------------------|--------------|-----------|---------------|

基本上,日期时间列应该是键,并且应该包含两个表中的所有值(没有重复),并且在表中找到的相应值应该出现在每个时间戳中(如果没有时间戳,则为 NULL)

我已尝试使用 FULL OUTER JOIN,但它似乎跳过了一些日期时间:

SELECT T1.col1, T1.col2, T2.col3, T2.col4, T1.datetime
FROM T1 FULL OUTER JOIN  T2 on T1.datetime=T2.datetime;

我还在右连接子查询上尝试了左连接,但仍然没有运气。

我觉得这应该有一个简单的解决方案。我错过了什么吗?

谢谢!

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql join timestamp impala


【解决方案1】:

很可能,它不是“跳过”日期时间值。相反,它们显示为NULL。您可以使用coalesce() 解决此问题:

SELECT T1.col1, T1.col2, T2.col3, T2.col4,
       COALESCE(T1.datetime, T2.datetime) as datetime
FROM T1 FULL OUTER JOIN
     T2 
     ON T1.datetime = T2.datetime;

大多数支持FULL JOIN的数据库也支持标准的USING子句,所以你也可以这样表达:

SELECT T1.col1, T1.col2, T2.col3, T2.col4,
       datetime
FROM T1 FULL OUTER JOIN
     T2 
     USING (datetime);

【讨论】:

  • ...因此,如果第二个表中的值不在第一个表中,则它们显示为 NULL,但 col 值仍然被复制。我不知道,因为我是按日期时间排序的,所以所有的 NULL 都在最后。您的第一个解决方案完美运行@Gordon。谢谢!
  • @habarnam 。 . .这在使用full join 时并不少见。它确实比其他 join 类型要复杂得多。
猜你喜欢
  • 2020-10-29
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 2013-03-31
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多