Hive 内部联接在配置单元中不提供结果
我正在尝试加入4个talbles。一个是主表,并将其他3个表与此主表连接。请参见如下数据: 预期产出 这是我开发的查询,它总是返回0行Hive 内部联接在配置单元中不提供结果,hive,hiveql,hadoop2,Hive,Hiveql,Hadoop2,我正在尝试加入4个talbles。一个是主表,并将其他3个表与此主表连接。请参见如下数据: 预期产出 这是我开发的查询,它总是返回0行 select COALESCE(TableB.Date, TableC.Date, TableD.Date), COALESCE(count(key1),0), COALESCE(count(key2),0), COALESCE(count(key3),0) FROM TableA A JOIN TableB
select COALESCE(TableB.Date, TableC.Date, TableD.Date),
COALESCE(count(key1),0),
COALESCE(count(key2),0),
COALESCE(count(key3),0)
FROM TableA A JOIN TableB B on A.Date = B.Date
JOIN TableC C on A.Date = C.Date
JOIN TableD D on A.Date = D.Date
Group by COALESCE(TableB.Date, TableC.Date, TableD.Date);
当我使用TableA对每个表运行单独的查询(请参见下面的查询)时,它会返回数据,但当我连接所有3个表时,它不会重新调整任何数据
select TableB.Date, count(key1)
FROM TableA A JOIN TableB B on A.Date = B.Date
Group by TableB.Date;
我不确定哪里出了问题,有人能帮助我理解join查询中的问题在哪里
谢谢,
巴布你可以试试这个-
select A.Date,
COALESCE(count(key1),0),
COALESCE(count(key2),0),
COALESCE(count(key3),0)
FROM TableA A
LEFT JOIN TableB B on A.Date = B.Date
LEFT JOIN TableC C on A.Date = C.Date
LEFT JOIN TableD D on A.Date = D.Date
Group by A.Date;
我使用左连接而不是内部连接,因为我们需要表A中的所有数据。第一列也应该来自表A,即驱动程序表。在子查询中进行连接,然后进行分组,例如
with join_table as (select COALESCE(TableB.Date, TableC.Date, TableD.Date) as Date,
key1, key2, key3
FROM TableA A JOIN TableB B on A.Date = B.Date
JOIN TableC C on A.Date = C.Date
JOIN TableD D on A.Date = D.Date
)
select Date,
COALESCE(count(key1),0),
COALESCE(count(key2),0),
COALESCE(count(key3),0)
from join_table
group by Date
实际上,您不需要在内部联接中合并联接键。我认为您正在寻找完整的外部联接。 下面是示例代码
select COALESCE(a.Date, b.Date, c.Date,d.Date),
COALESCE(sum(key1),0),
COALESCE(sum(key2),0),
COALESCE(sum(key3),0)
(select distinct date as date from tableA ) as a
full outer join
(select date ,sum(key1) as key1 from tableB group by date) as b
on a.date=b.date
full outer join
(select date ,sum(key2) as key2 from tableB group by date) as c
on a.date=c.date
full outer join
(select date ,sum(key3) as key2 from tableB group by date) as d
on a.date=d.date
Group by COALESCE(a.Date, b.Date, c.Date,d.Date);`
谢谢你的回复。我试着建议改变,但没有成功。此外,如果改变您建议的方式,来自C表的日期可能不在D表中。假设日期在表A中,但如果它不在任何其他表中,我们不需要来自表A的日期。您提到“这是主表,并将其他3个表与此主表连接”。因此我假设表A是主表。如果您说不希望表A中的日期不在任何其他表中,那么您需要在我的SQL
中添加where条件,其中COALESCE(TableB.date、TableC.date、TableD.date)不为NULL
。在这种情况下,我们不能使用Left-Join-right。我的查询与您提供的完全相同,只是使用了内部联接。使用内部连接时,我不会得到任何结果,如果我使用完全外部连接,我会得到奇怪的结果。内部连接将生成所有
表中存在的记录。完全外部联接将导致所有数据存在/不存在
。这完全取决于你的要求。你需要什么?1.所有表中的所有数据?(全速前进)2。所有数据都来自某些表?(向左转)3。所有表中的所有匹配数据+所有表中的所有不匹配数据?无论哪种情况,它都不起作用。我需要所有表中的所有日期,如果它出现在主表中。我认为这意味着它是所有表与主表的内部连接。我试过了,但没有任何效果(询问内容与您的建议和我在解释中给出的内容相同。不确定为什么不起作用。感谢您抽出时间回答我的问题。非常感谢。感谢您的回复,我会尝试一下,让您知道。感谢您的回复,我会尝试一下,让您知道。