Teradata 左连接删除空值
Teradata left join dropping nulls
在 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
然后包含缺失的行。
输出:
这与我的预期相反,我希望第一个查询包含空值,而第二个查询有效地成为内部联接,从而排除空值。为什么会这样?
查询和结果都是正确的。
案例一。
加入 product
列。如果某些产品没有匹配的密钥,department
将是 null
。显然,所有产品都可以加入,where
语句按date_purchase、品牌和数量过滤
案例二。
当连接条件中的某些内容不满足时,b
列将为 null
。在这种情况下,当 date_purchase
超出范围时,它将 department
标记为 null
。
在下面的示例中,您可以看到连接条件在未来有 day
个条件,但所有记录都是结果的一部分:
在 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
然后包含缺失的行。
输出:
这与我的预期相反,我希望第一个查询包含空值,而第二个查询有效地成为内部联接,从而排除空值。为什么会这样?
查询和结果都是正确的。
案例一。
加入 product
列。如果某些产品没有匹配的密钥,department
将是 null
。显然,所有产品都可以加入,where
语句按date_purchase、品牌和数量过滤
案例二。
当连接条件中的某些内容不满足时,b
列将为 null
。在这种情况下,当 date_purchase
超出范围时,它将 department
标记为 null
。
在下面的示例中,您可以看到连接条件在未来有 day
个条件,但所有记录都是结果的一部分: