【问题标题】:Remove duplicates from table which doesn't have any key column从没有任何键列的表中删除重复项
【发布时间】:2021-10-02 05:06:09
【问题描述】:

我有 2 个表 TabA 和 TabB。两者都没有任何键列。

在列方面,两者都是副本,并且有 80 多个列。

TabA 有 3000 万条记录。 TabB 只有 2000 条记录。

现在我需要比较两个表之间的所有列,因为没有关键列,并从 TabA 中删除重复记录。

我想找到比较两个表的最佳方法,而不是将所有 80 列放在 JOINS 或 WHERE 子句中。

【问题讨论】:

  • 两个表中是否有任何唯一标识符?到目前为止你尝试了什么,你能告诉我们那个代码吗?
  • 您好 Otter,感谢您对此进行调查。它是我们从源服务器进行 ETL 处理的日志表。由于 ETL 中的一些错误,我们将重复记录放入目标中。现在我们修复了 ETL 中的实际错误。但是现在我们需要从 Target 中删除重复项。我们已要求源数据库开发团队提供唯一记录,他们提供的列很少是唯一的,但是当我们将它们与目标进行比较时,我们再次发现重复的列更多。因此,我们决定比较所有列,并期待以最佳方法比较所有列的解决方案。
  • 专业提示:印度以外的许多人不知道 crore 是什么。我个人不得不用谷歌搜索它,我敢打赌我不是唯一的——所以不是每个人都会明白什么是 3 千万。但是,每个英文读者都能看懂3000万,甚至3000万。
  • 最好的方法是尝试识别这些表的自然键。希望它不是表范围的,但仅跨越几列。如果不是这样,那你就很难过。
  • 嗨佐哈尔,谢谢。更新为 3000 万条记录,如果没有更好的解决方案来比较所有列,那么我将使用识别自然键。

标签: sql sql-server tsql duplicates


【解决方案1】:

如果需要所有 80 列来识别记录,您将很难在查询中不使用所有这些列,无论以何种方式。

您可以在所有列上使用HASHBYTES() 计算哈希码,然后仅比较生成的哈希码。

还有 CHECKSUM(*) 函数计算所有列的哈希值,无需显式列出它们,但它返回 int 作为结果,如果不时出现误报,这太弱了。

【讨论】:

    猜你喜欢
    • 2013-04-13
    • 1970-01-01
    • 2011-10-09
    • 2019-08-24
    • 2014-09-30
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多