【问题标题】:Teradata left join dropping nullsTeradata 左连接删除空值
【发布时间】:2021-05-13 14:38:05
【问题描述】:

在 Teradata 16.20.53.29 中,当我按如下方式进行左连接和聚合时:

select
  b.department,
  sum(a.sales) as sales

from table1 a
  left join table2 b
    on b.product = a.product

where a.date_purchase >= '2018-01-01'
  and a.date_purchase <= '2020-01-01'
  and a.brand = 'ACME'
  and a.quantity > 0

group by 1
order by 1

我希望包含 table1 中而不是 table2 中的缺失行,但它们没有。

输出:

但是,如果我像这样重组查询:

select
   b.department,
   sum(a.sales) as sales

from table1 a
    left join table2 b
        on b.product = a.product
        and a.date_purchase >= '2018-01-01'
        and a.date_purchase <= '2020-01-01'
        and a.brand = 'ACME'
        and a.quantity > 0

group by 1
order by 1

然后包含缺失的行。

输出:

这与我的预期相反,我希望第一个查询包含空值,而第二个查询有效地成为内部连接,从而排除空值。为什么会这样?

【问题讨论】:

  • 您通过b.department 加入。没有匹配的时候你想要什么?
  • 第二个输出是我期待的输出/没有匹配时我想要的输出
  • 。 .您所描述的内容看起来像是 Teradata 中的错误。
  • 我真的怀疑这是一个错误,请从您的表格中发布示例数据。
  • 由于数据很敏感,将不得不编写一个 reprex,稍后再做

标签: sql teradata


【解决方案1】:

查询和结果都是正确的。

案例 1。 加入product 列。如果某些产品没有匹配的密钥,department 将是 null。显然,所有产品都可以加入,where语句按日期购买、品牌和数量过滤。

案例 2。 当连接条件中的某些内容不满足时,b 列将是 null。在这种情况下,当date_purchase 超出范围时,它会将department 标记为null

在以下示例中,您可以看到连接条件将来有day 条件,但所有记录都是结果的一部分:

http://sqlfiddle.com/#!9/b3eda88/1

【讨论】:

  • 这是否意味着第二个输出中的空值是表之间存在产品匹配但不满足品牌/日期/数量条件的行?
  • 是的.. 尝试在产品之间做一个简单的连接并放置一个 purchase_date > '2050-01-01' [未来的事情[。你应该取回所有记录
  • 谢谢,这修正了我对左连接如何工作的心理模型
猜你喜欢
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 2017-07-02
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多