与工会加入不同的记录

Posted

技术标签:

【中文标题】与工会加入不同的记录【英文标题】:Joining on different records with union 【发布时间】:2018-01-04 22:56:46 【问题描述】:

我有一个问题,尽管我尝试了一切,但我还是无法解决。 我正在创建一个具有多个连接的表,并将从 2 个不同数据库中提取的表合并起来,其中一些记录在两个数据库之间重叠,我有以下问题: 表一

+------+--------+-------+------+
| Col1 |  Col2  | Col3  | Algo |
+------+--------+-------+------+
|    1 | jOB1   | Test1 | NULL |
|    1 |  JOB2  | Test2 | NULL |
|    1 |  JOB3  | Test3 | Null |
+------+--------+-------+------+

表 2:

+------+--------+-------+-------+
| Col1 |  Col2  | Col3  | Algo  |
+------+--------+-------+-------+
|    1 | jOB1   | Test1 | NULL  |
|    1 |  JOB2  | Test2 | NULL  |
|    1 |  JOB3  | Test3 | ARFTU |
+------+--------+-------+-------+

联合

+------+-------+-------+-------+
| Col1 | Col2  | Col3  | Algo  |
+------+-------+-------+-------+
|    1 | jOB1  | Test1 | NULL  |
|    1 | JOB2  | Test2 | NULL  |
|    1 | JOB3  | Test3 | NULL  |
|    1 | JOB3  | Test3 | ARFTU |
+------+-------+-------+-------+

如何消除最终表中具有 NULL 值的行?如果另一个 行是否存在具有相同的 Col1、Col2、Col3 列?

提前致谢!!!

编辑我的最终结果以使这一点更清楚: 最后我想得到的表是表 2,即如果“算法”值不存在,则将该行保留为空。如果 'Algo' 值确实存在,则删除 NULL 记录并仅保留填充的记录:

+------+--------+-------+-------+
| Col1 |  Col2  | Col3  | Algo  |
+------+--------+-------+-------+
|    1 | jOB1   | Test1 | NULL  |
|    1 |  JOB2  | Test2 | NULL  |
|    1 |  JOB3  | Test3 | ARFTU |
+------+--------+-------+-------+

【问题讨论】:

您能提供正确的结果吗?目前还不是很清楚,您是希望消除所有NULLs 还是只消除带有NULL 的JOB3。 我想用 NULL 消除 Job3 @Gordon Linoff 答案是我要找的那个 【参考方案1】:

为什么不直接使用聚合?

select col1, col2, col3, max(algo) as algo
from ((select col1, col2, col3, algo from t1) union all
      (select col1, col2, col3, algo from t2)
     ) tt
group by col1, col2, col3;

【讨论】:

感谢您的建议!那行得通!我希望有一些更优雅的东西(我的实际表格有 30 多列),但仍然如此!谢谢!! @A.Lot 请将其标记为正确然后关闭它。【参考方案2】:

试试这个

select * from (
  select * from t1 where algo is not null
  union
  select * from t2 where algo is not null)
t

我首先尝试消除每个选择表。好吧,如果你有相同的 col1,2,3 值并且 algo 两者都有值,它将被获取。 如果 algo 具有相同的值,则合并,否则如果 algo 具有不同的值,则将两者都获取。

【讨论】:

【参考方案3】:

计算应该删除的那些(下表中的),然后 从结果中删除它们:

with both as (select * from t1 union select * from t2),
--- col1,col2,col3 for which one is null and the other is not
     inter as ((select col1, col2, col3 from t1 where algo is null 
               intersect
               select col1, col2, col3 from t2 where algo is not null) 
               UNION
               (select col1, col2, col3 from t1 where algo is not null 
               intersect
               select col1, col2, col3 from t2 where algo is null
select * from both
  except
-- remove those that are in the intersection but also have null
select * from 
    (select * from both where algo is null)  as temp2
    natural join inter;

【讨论】:

以上是关于与工会加入不同的记录的主要内容,如果未能解决你的问题,请参考以下文章

sql 工会加入

Hive 加入不同的

如何加入具有不同 CONTENT_ITEM_TYPE 但共享一个公共字段的记录,即 RAW_CONTACT_ID?

SpringCloud学习记录——网关(Zuul)

按最近日期加入 BigQuery 中具有重复记录的表

linq:在不同类型的条件下左加入 linq