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);