【问题标题】:Oracle 11g: table checksum or hashOracle 11g:表校验和或哈希
【发布时间】:2018-06-14 12:07:39
【问题描述】:

我想针对不同的视图进行校验和,实现不同的方法应该产生相同的结果(假设每个视图不包含重复项并且具有完全相同的列)。

问题

  1. 计算表校验和或哈希的最简单方法是什么?
  2. 如果 2 个表相同,校验和是否是在 Oracle 中进行比较的唯一方法?

注意: 谷歌搜索我发现了一些旧答案,例如this one

【问题讨论】:

  • Get the SHA-512 of any SQL query - 如果您想比较两个查询是否相等,请阅读评论部分
  • 谢谢。哪个评论区?如果在我提供的链接上,它是从 2005 年开始的
  • 我的意思是来自我提供的链接的 cmets。特别是即使两个查询返回相同的结果集也可能出错的示例
  • 好的。我读过但听起来很沉重(例如 DBMS_COMPARISON - download.oracle.com/docs/cd/B28359_01/appdev.111/b28419/…)。想知道是否还有其他方法,例如计算每行的校验和,对这些校验和行进行排序并对所有行进行校验和。如果是这样,Oracle 中执行校验和的功能是什么?
  • 如果要找哈希函数,可以使用ora_hash

标签: sql hash plsql oracle11g checksum


【解决方案1】:

如果 2 个表相同,校验和是否是在 Oracle 中进行比较的唯一方法?

不,因为你没有重复,你可以使用MINUS 运算符:

SELECT * FROM Table1
MINUS
SELECT * FROM Table2

将返回 Table1 中不存在于 Table2 中的所有行。如果返回零行,则Table1 中的所有行也存在于Table2 中。

如果你想在两个方向检查表格,那么:

SELECT *
FROM   (
  SELECT t1.*, 'T1' AS "WHERE" FROM Table1 t1
  MINUS
  SELECT t2.*, 'T1' FROM Table2 t2
)
UNION ALL
(
  SELECT t2.*, 'T2' FROM Table2 t2
  MINUS
  SELECT t1.*, 'T2' FROM Table1 t1
)

同样,如果没有返回行,则表是相同的。

如果您正在比较具有重复项的表,并且希望每个表中的重复行数相同,那么您可以使用以下内容:

SELECT Col1, Col2, Col3, /*...*/ ColN,
       ROW_NUMBER() OVER ( PARTITION BY Col1, Col2, Col3, /*...*/ ColN ORDER BY ROWNUM )
         AS rn
FROM   table1
MINUS
SELECT Col1, Col2, Col3, /*...*/ ColN,
       ROW_NUMBER() OVER ( PARTITION BY Col1, Col2, Col3, /*...*/ ColN ORDER BY ROWNUM )
         AS rn
FROM   table2

【讨论】:

  • 谢谢。两者都经过测试,听起来可以正常工作。只是改变了两个方向:SELECT * FROM (SELECT VIEW_B2.*, 'T1' AS t FROM VIEW_B2 MINUS SELECT VIEW_B3.*, 'T1' FROM VIEW_B3) UNION ALL (SELECT VIEW_B3.*, 'T2' as t FROM VIEW_B3 MINUS SELECT VIEW_B2.*, 'T2' FROM VIEW_B2 );
  • 在 select 子句中添加 distinct 是否允许这些解决方案在重复的情况下工作?
  • @HeyStackExchange 使用DISTINCT(甚至不使用DISTINCT)可以让您检查第一个表中是否有不在第二个表中的行,但不是您有相同的数字每个表中的重复项。我已经更新了一种检查每个表中是否有相同数量的重复行的方法。
  • 谢谢!听起来不需要校验和。经测试。标记为正确并投票赞成!
猜你喜欢
  • 2010-12-06
  • 2013-01-10
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 2016-11-23
  • 1970-01-01
相关资源
最近更新 更多