【问题标题】:Combine two queries while keeping all the results合并两个查询,同时保留所有结果
【发布时间】:2020-06-23 21:58:47
【问题描述】:

我有两张表,我必须合并结果,将所有结果保存在一个数据集中。

我尝试了各种连接,但没有返回结果。

我需要 SQL Server 和 MS Access 的查询。

例子:

TAB_A

+---------------------+------+
|       DATAORA       |  P1  |
+---------------------+------+
| 02/05/2020 15:00:30 | 100  |
| 02/05/2020 15:15:30 | 200  |
| 02/05/2020 15:30:30 | 300  |  
| 02/05/2020 15:45:30 | NULL |
| 02/05/2020 16:00:30 | 500  |
+---------------------+------+

TAB_B

+---------------------+------+
|         ORA         |  P2  |
+---------------------+------+
| 02/05/2020 15:00:30 | 600  |
| 02/05/2020 15:16:30 | 700  |
| 02/05/2020 15:40:30 | NULL |  
| 02/05/2020 15:45:30 | 800  |
| 02/05/2020 15:59:30 | 900  |
+---------------------+------+

结果

+---------------------+------+------+
|       DATAORA       |  P1  |  P2  |
+---------------------+------+------+
| 02/05/2020 15:00:30 | 100  | 600  |
| 02/05/2020 15:15:30 | 200  | NULL |
| 02/05/2020 15:16:30 | NULL | 700  |
| 02/05/2020 15:30:30 | 300  | NULL |
| 02/05/2020 15:40:30 | NULL | NULL |
| 02/05/2020 15:45:30 | NULL | 800  |
| 02/05/2020 15:59:30 | NULL | 900  |
| 02/05/2020 16:00:30 | 500  | NULL |
+---------------------+------+------+

【问题讨论】:

  • 完全外连接怎么样?
  • 稍微绕道......你已经有几个很好的答案,但我觉得我应该建议你不要对对象或列名使用保留字。 TIME 和 TIMESTAMP 都是 sql server 中的数据类型。此外,它们是如此模糊,以至于几乎是无用的列名。
  • 发布您的尝试也是正常的,因此我们可以看到您采取的方向以及有效/无效的方法。
  • @SeanLange TIMESTAMP 和 TIME 我只用它们来创建示例,在 DB 中它们被称为 DataOra 和 Data
  • 酷我也希望如此。 :D

标签: sql sql-server ms-access join full-outer-join


【解决方案1】:

您所描述的是full join。如果您的 RDBMS 支持它,那么逻辑是:

select time, a.p1, b.p2
from ( ... query A ...) a
full join ( ... query B ...) b using(time)

请注意,这假定两个查询都返回一个名为 time 的列,这样可以简化语法。

如果你的数据库不支持full joins,你可以使用union all和聚合:

select time, max(p1) p1, max(p2) p2
from (
    select time, p1, null from (... query A ...)
    union all select time, p1, null from (... query B ...)
) t
group by time

【讨论】:

  • @P13TR0:您在哪个数据库中运行查询?
  • sql server 2005 但我需要 SQL Server 和 MS Access 的查询
  • SQL Server 2005 是一个非常旧的版本;它支持full joins,可能不是using 语法。而且 Access 无论如何都不支持full join。如果您想要在两个数据库上运行的查询,请尝试第二个。
【解决方案2】:

PIVOT 怎么样

示例

Select *
 From  (
        Select DATAORA,P1,Item = 'P1' From Tab_A
        Union All
        Select ORA    ,P2,Item = 'P2' From Tab_B
       ) src
 Pivot (sum(P1) for Item in ([P1],[P2]) ) pvt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2011-04-05
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2022-06-16
    • 2016-10-27
    相关资源
    最近更新 更多