【问题标题】:CHECKSUM_AGG Equivalent in OracleOracle 中的 CHECKSUM_AGG 等效项
【发布时间】:2017-05-31 21:03:39
【问题描述】:

我有一个疑问

STANDARD_HASH(Column1|Column2|ColumnN, 'MD5') AS HashValue

表中的每一行。

是否可以按 ColumnX 进行 GROUP 并生成哈希值的聚合?

我已经尝试过 LISTAGG,但不幸的是,这会导致串联太大而无法无误地散列(尽管我可能没有正确应用它)。

PSEUDO ORACLE 演示我想要实现的目标:

SELECT ColumnX, UNKNOWN_AGGREGATE_FUNC(STANDARD_HASH(Column1|Column2|ColumnN, 'MD5'))
FROM TableY
GROUP BY ColumnX

基本上我的推理是,理想情况下,我想通过 ColumnX 对哈希值进行批处理,以便我可以通过网络传输批处理结果以与外部系统进行比较,因此不必传输每个批次匹配的情况下的行。

【问题讨论】:

标签: sql oracle


【解决方案1】:

将散列转换为数字,对每批散列求和,然后比较总和。

示例架构

--drop table tableY;
create table tableY(columnX number, column1 number, column2 number, columnN number);

insert into tableY values(1, 1,1,1);
insert into tableY values(1, 2,2,2);

insert into tableY values(2, 1,1,1);
insert into tableY values(2, 2,2,2);

insert into tableY values(3, 1,1,1);

比较 SQL

转换有点难看。主要限制之一是数值精度,这就是 SUBSTR(..., 1, 15) 的原因。

像这样对哈希进行子串化和求和可能会丢失一些重要的加密属性,但这应该足以进行比较。

select
    columnX,
    trim(
        upper(
            to_char(hash_sum, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
        )
    ) hash_sum
from
(
    select columnX, 
        sum(
            to_number(
                substr(
                    standard_hash(column1||column2||columnN, 'MD5')
                    , 1, 15
                )
                , 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
            )
        ) hash_sum
    from tableY
    group by columnX
);

COLUMNX   HASH_SUM
-------   --------
1         1264B85078436A7F
2         1264B85078436A7F
3         698D51A19D8A121

【讨论】:

  • 对丢失加密属性感到高兴,希望将其用于远程表的相对大规模的通用比较,将尝试一下,谢谢。
【解决方案2】:

Oracle 20c 支持CHECKSUM 解析/聚合函数:

使用 CHECKSUM 检测表中的更改。表中行的顺序不影响结果。

您可以将 CHECKSUM 与 DISTINCT 一起使用,作为 GROUP BY 查询的一部分,作为窗口函数或分析函数。

伪代码:

SELECT ColumnX, CHECKSUM(STANDARD_HASH(Column1|Column2|ColumnN, 'MD5'))
FROM TableY
GROUP BY ColumnX;

【讨论】:

  • 对于 20c+ 的人来说,这看起来比我的答案更好。
  • @JonHeller 是的,随着每个版本,我们得到越来越多的好东西,可以解决旧案例。
猜你喜欢
  • 2011-07-25
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
相关资源
最近更新 更多