SQL JOIN,所有来自 t1 和所有来自 t2,除了 t1 的共同点

Posted

技术标签:

【中文标题】SQL JOIN,所有来自 t1 和所有来自 t2,除了 t1 的共同点【英文标题】:SQL JOIN, all from t1 and all from t2 except what's common to t1 【发布时间】:2021-07-04 15:50:32 【问题描述】:

我需要表 A 中的所有条目以及表 B 中与表 A 不通用的所有条目。我有 6 个通用字段。我该怎么做?我尝试从表 A 左连接表 B 中选择 ...,它错过了表 A 中的一些值。还尝试了右连接、完全连接...关于如何执行此操作的任何指针?

【问题讨论】:

请提供样本数据和期望的结果。 有什么不常见的列吗? 您如何确定 t2 和 t1 之间的公共行?单列? 【参考方案1】:

嗯。 . .这是你想要的吗?假设ab 具有相同的列:

select a.*
from a
union all
select b.*
from b
where not exists (select 1
                  from a
                  where a.col1 = b.col1 and a.col2 = b.col2 and . . .
                 );

编辑:

SparkSQL 应该支持not exists,但您可以改用left join 编写它:

select a.*
from a
union all
select b.*
from b left join
     a
     on a.col1 = b.col1 and a.col2 = b.col2 and . . .
where a.col1 is null;

【讨论】:

我正在使用 sparksql,是否存在不存在的等价物? select 1 有什么作用?【参考方案2】:

我认为最简单的方法是使用这样的UNION 运算符:

(SELECT * FROM TableA)
UNION
(SELECT * FROM TableB); 

联合运算符用于组合两个或多个SELECT 语句的结果集。

【讨论】:

以上是关于SQL JOIN,所有来自 t1 和所有来自 t2,除了 t1 的共同点的主要内容,如果未能解决你的问题,请参考以下文章

用于部分重叠数据的 Sql Join

如何使用插入和连接在一起

Left Join 横向和数组聚合

根据与SQL中其他表的重合,来自同一字段的合并行?

SQL Multiple COUNT() 来自两个表,在一个 LEFT JOIN 中

如何使用 SQL 进行可选 JOIN