【问题标题】:Best way to combine two tables, remove duplicates, but keep all other non-duplicate values in SQL组合两个表、删除重复项、但在 SQL 中保留所有其他非重复值的最佳方法
【发布时间】:2022-01-08 04:22:06
【问题描述】:

我正在寻找将两个表组合在一起的最佳方法,该方法将根据电子邮件删除重复记录,优先使用“表 2”中的值替换任何重复记录,我已考虑完全外部联接和 UNION ALL但是 Union all 会太大,因为每个表都有 1000 列。我想创建这个组合表作为我的完整引用表并保存为视图,这样我就可以引用它,而不必总是在我已经很复杂的语句中添加联合或类似的东西。据我了解,完全外部连接不一定会删除重复项。我想:

一个。使用两个表中的所有列创建表(不适用于一个表中的记录的字段将只有空值)

b.根据电子邮件字段从此主表中删除重复记录,但仅删除表 1 记录并保留表 2 重复项,因为它们具有我想要的信息

c。左连接不起作用,因为两个表都有我想要保留的唯一记录,并且我希望从每个表中保留所有 1000 多列

我什至不知道这有多可行,但非常感谢您的任何回答!

【问题讨论】:

  • 这是什么 DBMS(和版本)?有了这么多列,任何解决方案都将依赖于特定的 DBMS。
  • 你的表应该是数据库而不是有那么多列
  • 这是在 Google BigQuery 中。是的,你可能是对的,不过我不是数据库经理,这是我的工作。这只是为了创建一个视图,以便我可以更轻松地在我自己的任务的查询中引用它

标签: sql join google-bigquery union


【解决方案1】:

如果我正确理解您的问题,您希望使用电子邮件列作为连接条件来连接两个包含数千列(希望)在两个表之间相同的大表,并用记录替换两个表之间的重复记录来自表 2。
几天前我不得不做类似的事情,所以也许你可以根据你的目的修改我的查询:

WITH only_in_table_1 AS(
SELECT *
FROM table_1 A
WHERE NOT EXISTS
(SELECT * FROM table_2 B WHERE B.email_field = A.email_field))
SELECT * FROM table_2
UNION ALL
SELECT * FROM only_in_table_1

如果表之间的列/字段不同,您可以在 only_in_table_1table_2 上使用完全外连接

【讨论】:

  • 非常感谢随机数据科学家!
  • @mariah.davis 没问题。如果有帮助,请考虑接受我的回答!
【解决方案2】:

尝试在两个表之间使用 FULL OUTER JOIN,然后在每个结果集列上使用 COALESCE 函数来确定从哪个表/列填充结果集列

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-26
    • 2017-12-28
    • 2020-08-04
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多