【问题标题】:Using Left & Full Outer Joins Together一起使用左外连接和全外连接
【发布时间】:2020-07-14 07:28:11
【问题描述】:

[简化我的表格] 我有一个 Excel 模型,它根据按月汇总的客户订单输出预测。 表A

+----------+--------+----------+
| Customer | Volume |   Date   |
+----------+--------+----------+
| A        |    100 | 1/1/2020 |
| B        |    100 | 1/1/2020 |
| C        |    100 | 1/1/2020 |
| A        |    100 | 2/1/2020 |
| B        |    100 | 2/1/2020 |
| C        |    100 | 2/1/2020 |
+----------+--------+----------+

我想将此数据加入来自数据库的实时数据,该数据库也按第一次日期每月汇总(即,如果客户在 20 年 1 月 5 日的订单 = 2020 年 1 月 1 日)。表 B:

+----------+--------+----------+
| Customer | Volume |   Date   |
+----------+--------+----------+
| A        |    100 | 1/1/2020 |
| A        |    100 | 1/1/2020 |
| A        |    100 | 1/1/2020 |
| B        |    100 | 2/1/2020 |
| B        |    100 | 2/1/2020 |
| Z        |    10  | 2/1/2020 |
+----------+--------+----------+

我还有第三张表,只有客户的第一个订单日期:表 C:

+----------+----------+--+
| Customer |   Date   |  |
+----------+----------+--+
| A        | 1/1/2020 |  |
| B        | 1/1/2020 |  |
| C        | 1/1/2020 |  |
| Z        | 2/1/2020 |  |
+----------+----------+--+

我想比较预测 (A) 与传入的实时数据 (B) 的跟踪情况,以及添加客户的第一个订单日期 (C)。因为 (B) 是最细粒度的数据,所以我开始以此为基础。如果我对 (A) 和 (C) 进行左连接,则表 A 的某些部分会被切断(我不想要);但是我的表(C)数据正确输入。如果我对 (A) 进行完全外连接,那么我确实可以正确输入总预测,但完全外连接会弄乱表 (C)。为了增加更多的复杂性,表 B 可能有其他不属于预测的客户,所以我也需要查看这些数据。

预测数字被截断:

select 
 b.customer,
 b.volume,
 b.date,
 a.volume,
 c.date
from b
left join a on b.customer = a.customer
left join c on c.customer = b.customer

数据不正确:

select 
     b.customer,
     b.volume,
     b.date,
     a.volume,
     c.date
    from b
    full outer join a on b.customer = a.customer
    left join c on c.customer = b.customer

【问题讨论】:

  • MySQL 没有FULL OUTER JOIN
  • “弄乱表 C”是什么意思?它到底有什么不正确的地方?
  • 我会先熟悉主键的概念
  • 我去掉了 MySQL 标签,因为 MySQL 不支持FULL JOIN。请标记您真正使用的数据库。此外,您还没有显示您想要的结果,这将有助于回答问题。
  • @Bambatman 。 . .您也没有对日期做出任何解释。

标签: sql


【解决方案1】:

使用 coalesce 函数将表 C 与表 A 和 B 的条目连接起来:

select 
     coalesce(a.customer, b.customer),
     b.volume,
     b.date,
     a.volume,
     c.date
    from b
    full outer join a on b.customer = a.customer
    left join c on c.customer = COALESCE(b.customer, a.customer)

【讨论】:

    猜你喜欢
    • 2014-09-23
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 2011-10-01
    • 2014-02-24
    • 1970-01-01
    相关资源
    最近更新 更多