Presto - 使用唯一标识符连接多个表
Presto - Concat multiple tables using unique identifier
我有多个 table 格式如下:
table 用户 -
ID lang
1 EN
2 EN
3 DE
table一个-
ID event1 event2
1 5 1
2 null 1
3 11 null
table乙-
ID event1 event10
1 2 1
3 2 null
所以在 concat/join 之后 ID 列上的 tables 我的最终 table 看起来像这样:
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
所以我在这里有多个问题,首先如何正确地进行连接,以便别名匹配 table 名称并具有最终的唯一列名称,即使事件在列中具有相同的命名,而且我希望所有缺失值也具有空值(例如 table B 没有用户 ID = 2)。
到目前为止,我的尝试没有成功,因为列名会在没有唯一 ID 的情况下重复,并且缺失值没有正确填充空值。
我已经尝试过的示例:
select t1.*, t2.*, t3.*
from users t1
left join
A t2
using (ID)
left join
B t3
using (ID)
我可以通过编程方式构建查询以提供灵活性,但我想知道这种情况下的正确语法。
谢谢。
您对两个左联接的尝试看起来很不错。但是,我建议不要使用 using(id)
语法来加入 tables:涉及 3 个 tables,您指的是哪个 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
(只要 id
在每个 table 中都是唯一的,如您的示例数据)。
如果表中的非 id 列是唯一的,那么您可以将其表示为:
select *
from users u left join
A
using (ID) left join
B
using (ID);
三个表中的id
是同一个意思,所以用using
比较合适。事实上,using
在处理外部 join
时非常方便(尽管 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);
我有多个 table 格式如下:
table 用户 -
ID lang
1 EN
2 EN
3 DE
table一个-
ID event1 event2
1 5 1
2 null 1
3 11 null
table乙-
ID event1 event10
1 2 1
3 2 null
所以在 concat/join 之后 ID 列上的 tables 我的最终 table 看起来像这样:
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
所以我在这里有多个问题,首先如何正确地进行连接,以便别名匹配 table 名称并具有最终的唯一列名称,即使事件在列中具有相同的命名,而且我希望所有缺失值也具有空值(例如 table B 没有用户 ID = 2)。
到目前为止,我的尝试没有成功,因为列名会在没有唯一 ID 的情况下重复,并且缺失值没有正确填充空值。
我已经尝试过的示例:
select t1.*, t2.*, t3.*
from users t1
left join
A t2
using (ID)
left join
B t3
using (ID)
我可以通过编程方式构建查询以提供灵活性,但我想知道这种情况下的正确语法。
谢谢。
您对两个左联接的尝试看起来很不错。但是,我建议不要使用 using(id)
语法来加入 tables:涉及 3 个 tables,您指的是哪个 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
(只要 id
在每个 table 中都是唯一的,如您的示例数据)。
如果表中的非 id 列是唯一的,那么您可以将其表示为:
select *
from users u left join
A
using (ID) left join
B
using (ID);
三个表中的id
是同一个意思,所以用using
比较合适。事实上,using
在处理外部 join
时非常方便(尽管 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);