如何在获得完全外部联接的同一列上进行选择?
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 列。让我知道结果。
【讨论】:
以上是关于如何在获得完全外部联接的同一列上进行选择?的主要内容,如果未能解决你的问题,请参考以下文章
如何在一个列上进行分组,在另一个列上聚合数组并创建一个由分组列作为键的 JSON 对象