Presto - 使用唯一标识符连接多个表
Posted
技术标签:
【中文标题】Presto - 使用唯一标识符连接多个表【英文标题】:Presto - Concat multiple tables using unique identifier 【发布时间】:2020-04-05 15:35:10 【问题描述】:我有多个表格,格式如下:
表用户 -
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
所以在连接/加入 ID 列上的表格后,我的最终表格将如下所示:
final_table -
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
所以我在这里有多个问题,首先如何正确地进行连接,以便别名匹配表名并具有最终唯一的列名,即使事件在列内具有相同的命名,我也想要所有缺失的值也会有空值(比如没有用户 ID = 2 的表 B)。
到目前为止,我的尝试并不成功,因为列名会在没有唯一 ID 的情况下重复,并且缺少的值没有正确填充空值。
我已经尝试过的示例:
select t1.*, t2.*, t3.*
from users t1
left join
A t2
using (ID)
left join
B t3
using (ID)
我可以以编程方式构造查询以提供灵活性,但我想知道这种情况的正确语法。
谢谢。
【问题讨论】:
您的语法看起来不错,只是您应该在select
中明确列出列。
【参考方案1】:
您对两个左连接的尝试看起来相当不错。但是,我建议不要使用 using(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 在每个表中都是唯一的,如您的示例数据所示)。
【讨论】:
【参考方案2】:如果表中的非 id 列是唯一的,那么您可以将其表示为:
select *
from users u left join
A
using (ID) left join
B
using (ID);
id
在三个表中的意思是一样的,所以用using
比较合适。事实上,using
在使用外部 join
s 时非常方便(尽管使用 full join
更是如此)。
我不太喜欢使用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);
【讨论】:
以上是关于Presto - 使用唯一标识符连接多个表的主要内容,如果未能解决你的问题,请参考以下文章
iOS 和 Android 无需连接即可访问的蓝牙设备是不是有唯一标识符?
如何连接相对路径或生成嵌套文件夹中包含的唯一标识符 svg?