Sql Presto-使用唯一标识符连接多个表
我有以下格式的多个表: 表用户-Sql Presto-使用唯一标识符连接多个表,sql,hive,hiveql,presto,amazon-athena,Sql,Hive,Hiveql,Presto,Amazon Athena,我有以下格式的多个表: 表用户- ID lang 1 EN 2 EN 3 DE 表A- ID event1 event2 1 5 1 2 null 1 3 11 null 表B- ID event1 event10 1 2 1 3 2 null 因此,在concat/join ID列上的表之后,我的最终表将如下所示: 最终表格- ID lang A_event1 A_event2 B_event1 B_event10 1 EN
ID lang
1 EN
2 EN
3 DE
表A-
ID event1 event2
1 5 1
2 null 1
3 11 null
表B-
ID event1 event10
1 2 1
3 2 null
因此,在concat/join ID列上的表之后,我的最终表将如下所示:
最终表格-
ID lang A_event1 A_event2 B_event1 B_event10
1 EN 5 1 2 1
2 EN null 1 null null
3 DE 11 null 2 null
因此,我这里有多个问题,首先,如何正确地进行连接,使别名与表名匹配,并具有最终唯一的列名,即使事件在列中具有相同的命名,而且我希望所有缺少的值也具有空值(例如,表B没有用户ID=2)
到目前为止,我的尝试没有成功,因为列名将在没有唯一ID的情况下重复,并且缺少的值没有正确地用空值填充
我已经尝试过的示例:
select t1.*, t2.*, t3.*
from users t1
left join
A t2
using (ID)
left join
B t3
using (ID)
我可以通过编程方式构造查询以提供灵活性,但我想知道这种情况下的正确语法
谢谢。您尝试使用两个左连接看起来相当不错。但是,我建议不要使用
使用(id)
语法来连接表:由于涉及3个表,您所引用的id
列不明确,这可能导致结果集中缺少记录:
select
u.id,
u.lang,
ta.event1 A_event1,
ta.event2 A_event2,
tb.event1 B_event1,
tb.event110 B_event10
from users u
left join tableA ta on ta.id = u.id
left join tableB tb on tb.id = u.id
我看不出此查询如何在结果集中生成重复的
id
s(只要id
s在每个表中都是唯一的,如示例数据所示)。如果表中的非id列是唯一的,则可以将其表示为:
select *
from users u left join
A
using (ID) left join
B
using (ID);
id
在这三个表中的含义相同,因此使用using
是合适的。事实上,在使用外部连接时,使用非常方便(尽管使用完全连接时更方便)
我不太喜欢使用select*
。在这种情况下,这是不合适的,因为列不是唯一的。因此,编写查询的好方法是:
select u.*,
a.event1 as a_event1, a.event2 as a_event2,
b.event1 as b_event1, b.event10 as b_event10
from users u left join
A
using (ID) left join
B
using (ID);
您的语法看起来不错,只是应该在select
中明确列出列。