Oracle 11g:table 校验和或哈希

Oracle 11g: table checksum or hash

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

问题

  1. 计算 table 校验和或散列的最简单方法是什么?
  2. 如果 2 table 相同,校验和是 Oracle 中比较的唯一方法吗?

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

Is a checksum the only way to compare in Oracle if 2 tables are identical ?

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

SELECT * FROM Table1
MINUS
SELECT * FROM Table2

将 return Table1 中不存在于 Table2 中的所有行。如果零行被 returned 那么 Table1 中的所有行也存在于 Table2.

如果您想检查两个方向的 table,则:

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
)

同样,如果没有行被 return 编辑,那么 table 是相同的。

如果您将 table 与重复项进行比较,并且希望每个 table 中的重复行数相同,那么您可以使用类似的东西:

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