如何在获得完全外部联接的同一列上进行选择?

Posted

技术标签:

【中文标题】如何在获得完全外部联接的同一列上进行选择?【英文标题】:How to select on the same column that is getting full outer join on? 【发布时间】:2017-02-07 06:07:34 【问题描述】:

如果我有两张桌子

Table A
user_id type
123     tier1
124     tier2

Table B
user_id sub_type
123     sub_tier1
125     sub_tier2

我想full outer加入他们并成为

user_id type sub_type
123     tier1   sub_tier1
124     tier2   null
125     null    sub_tier2

我试过类似的东西

select coalesce(A.user_id, B.user_id) as user_id, type, sub_type from A.user_id = B.user_id 上的完全外连接 B

但它不起作用,因为它只获取user_id 的子集,而不是从两个表中组合user_ids

更多细节: 我实际上是用 Spark SQL 运行它的,通过使用上面的查询,与在数据帧中执行它相比,它的结果实际上要少得多

tablea.join(tableb, "user_id", "full")

【问题讨论】:

您使用的是哪个数据库系统?这是完全外连接的正确结果。您的预期结果是什么? ^ 阅读问题预期结果是否存在 请指明数据库并发布完整查询您很可能在执行第一个外部连接错误,随后在删除空行的结果上执行where 抱歉,我刚刚更新了我的问题的更多细节 我在 spark 数据集中也面临同样的问题。在 spark shell 中的输出与预期的一样,但在 spark 数据集中却没有。你有什么解决方法吗? 【参考方案1】:

我在这里没有看到任何问题。请参考下面的sn-p

WITH tablea (user_id, type) 
     AS (SELECT '123', 
                'tier1' 
         UNION 
         SELECT '124', 
                'tier2'), 
     tableb (user_id, sub_type) 
     AS (SELECT '123', 
                'sub_tier1' 
         UNION 
         SELECT '125', 
                'sub_tier2') 
SELECT COALESCE(a.user_id, b.user_id) AS user_id, 
       type, 
       sub_type 
FROM   tablea a 
       FULL OUTER JOIN tableb b 
                    ON a.user_id = b.user_id; 

USER_ID |TYPE   |SUB_TYPE 
123     |tier1  |sub_tier1
124     |tier2  |(null)   
125     |(null) |sub_tier2
(Complete, 3 rows buffered in 0:00.9) 

【讨论】:

【参考方案2】:

正如评论中提到的,我也面临着类似的问题。我重命名了加入密钥并解决了问题。尝试重命名 user_id 列。让我知道结果。

【讨论】:

以上是关于如何在获得完全外部联接的同一列上进行选择?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 >2 个表上进行外部联接 (Oracle)

按DAY,MONTH,YEAR分组时sql缺少行

如何在一个列上进行分组,在另一个列上聚合数组并创建一个由分组列作为键的 JSON 对象

如何在employee_id上 进行内部联接时获取每个唯一员工的销售总额

忽略单峰的内部联接

需要解释在同一列上进行自联接查询的工作[重复]