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

我看不出此查询将如何在结果集中生成重复的 ids(只要 ids 在每个表中都是唯一的,如您的示例数据所示)。

【讨论】:

【参考方案2】:

如果表中的非 id 列是唯一的,那么您可以将其表示为:

select *
from users u left join
     A 
     using (ID) left join
     B
     using (ID);

id在三个表中的意思是一样的,所以用using比较合适。事实上,using 在使用外部 joins 时非常方便(尽管使用 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 - 使用唯一标识符连接多个表的主要内容,如果未能解决你的问题,请参考以下文章

来自两个表的 PL/SQL 唯一列标识

iOS 和 Android 无需连接即可访问的蓝牙设备是不是有唯一标识符?

如何连接相对路径或生成嵌套文件夹中包含的唯一标识符 svg?

为啥新的 ASP.NET 标识表停止使用 Guid(唯一标识符类型)作为键?

按唯一标识符聚合并将相关值连接成一个字符串[重复]

通过唯一标识符组合查询结果的行?